{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "eescYG-ydDBX",
        "outputId": "b90b5bd4-3b52-4fe6-ce84-f5847184c579"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting dill\n",
            "  Downloading dill-0.3.9-py3-none-any.whl.metadata (10 kB)\n",
            "Downloading dill-0.3.9-py3-none-any.whl (119 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m119.4/119.4 kB\u001b[0m \u001b[31m3.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hInstalling collected packages: dill\n",
            "Successfully installed dill-0.3.9\n"
          ]
        }
      ],
      "source": [
        "import pandas as pd\n",
        "import keras\n",
        "import numpy as np\n",
        "!pip install dill\n",
        "import dill\n",
        "from sklearn.model_selection import KFold\n",
        "from sklearn.metrics import f1_score\n",
        "import warnings\n",
        "import itertools\n",
        "import numpy as np\n",
        "import tensorflow as tf\n",
        "import itertools\n",
        "from tensorflow.keras.models import Sequential\n",
        "from tensorflow.keras.layers import Dense, Dropout, BatchNormalization\n",
        "from sklearn.metrics import confusion_matrix, classification_report, f1_score, roc_curve, roc_auc_score\n",
        "from tensorflow.keras.initializers import HeNormal, LecunNormal\n",
        "from tensorflow.keras.callbacks import EarlyStopping\n",
        "from tensorflow.keras.callbacks import ReduceLROnPlateau"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 330
        },
        "id": "60jUOV-0fZkk",
        "outputId": "76ed12a9-f431-4d7e-80f5-401fdea2c3f8"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading...\n",
            "From: https://drive.google.com/uc?id=108Rg2FdrnQuh2O_klrQWalZI7orvN5fj\n",
            "To: /content/Diagnostics.xlsx\n",
            "\r  0% 0.00/832k [00:00<?, ?B/s]\r100% 832k/832k [00:00<00:00, 43.3MB/s]\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "                     FileName Rhythm       Beat  PatientAge  Gender  \\\n",
              "0  MUSE_20180113_171327_27000   AFIB   RBBB TWC          85    MALE   \n",
              "1  MUSE_20180112_073319_29000     SB        TWC          59  FEMALE   \n",
              "2  MUSE_20180111_165520_97000     SA       NONE          20  FEMALE   \n",
              "3  MUSE_20180113_121940_44000     SB       NONE          66    MALE   \n",
              "4  MUSE_20180112_122850_57000     AF  STDD STTC          73  FEMALE   \n",
              "\n",
              "   VentricularRate  AtrialRate  QRSDuration  QTInterval  QTCorrected  RAxis  \\\n",
              "0              117         234          114         356          496     81   \n",
              "1               52          52           92         432          401     76   \n",
              "2               67          67           82         382          403     88   \n",
              "3               53          53           96         456          427     34   \n",
              "4              162         162          114         252          413     68   \n",
              "\n",
              "   TAxis  QRSCount  QOnset  QOffset  TOffset  \n",
              "0    -27        19     208      265      386  \n",
              "1     42         8     215      261      431  \n",
              "2     20        11     224      265      415  \n",
              "3      3         9     219      267      447  \n",
              "4    -40        26     228      285      354  "
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-69fd4b15-1b27-4109-8b59-07a303102b53\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>FileName</th>\n",
              "      <th>Rhythm</th>\n",
              "      <th>Beat</th>\n",
              "      <th>PatientAge</th>\n",
              "      <th>Gender</th>\n",
              "      <th>VentricularRate</th>\n",
              "      <th>AtrialRate</th>\n",
              "      <th>QRSDuration</th>\n",
              "      <th>QTInterval</th>\n",
              "      <th>QTCorrected</th>\n",
              "      <th>RAxis</th>\n",
              "      <th>TAxis</th>\n",
              "      <th>QRSCount</th>\n",
              "      <th>QOnset</th>\n",
              "      <th>QOffset</th>\n",
              "      <th>TOffset</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>MUSE_20180113_171327_27000</td>\n",
              "      <td>AFIB</td>\n",
              "      <td>RBBB TWC</td>\n",
              "      <td>85</td>\n",
              "      <td>MALE</td>\n",
              "      <td>117</td>\n",
              "      <td>234</td>\n",
              "      <td>114</td>\n",
              "      <td>356</td>\n",
              "      <td>496</td>\n",
              "      <td>81</td>\n",
              "      <td>-27</td>\n",
              "      <td>19</td>\n",
              "      <td>208</td>\n",
              "      <td>265</td>\n",
              "      <td>386</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>MUSE_20180112_073319_29000</td>\n",
              "      <td>SB</td>\n",
              "      <td>TWC</td>\n",
              "      <td>59</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>52</td>\n",
              "      <td>52</td>\n",
              "      <td>92</td>\n",
              "      <td>432</td>\n",
              "      <td>401</td>\n",
              "      <td>76</td>\n",
              "      <td>42</td>\n",
              "      <td>8</td>\n",
              "      <td>215</td>\n",
              "      <td>261</td>\n",
              "      <td>431</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>MUSE_20180111_165520_97000</td>\n",
              "      <td>SA</td>\n",
              "      <td>NONE</td>\n",
              "      <td>20</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>67</td>\n",
              "      <td>67</td>\n",
              "      <td>82</td>\n",
              "      <td>382</td>\n",
              "      <td>403</td>\n",
              "      <td>88</td>\n",
              "      <td>20</td>\n",
              "      <td>11</td>\n",
              "      <td>224</td>\n",
              "      <td>265</td>\n",
              "      <td>415</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>MUSE_20180113_121940_44000</td>\n",
              "      <td>SB</td>\n",
              "      <td>NONE</td>\n",
              "      <td>66</td>\n",
              "      <td>MALE</td>\n",
              "      <td>53</td>\n",
              "      <td>53</td>\n",
              "      <td>96</td>\n",
              "      <td>456</td>\n",
              "      <td>427</td>\n",
              "      <td>34</td>\n",
              "      <td>3</td>\n",
              "      <td>9</td>\n",
              "      <td>219</td>\n",
              "      <td>267</td>\n",
              "      <td>447</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>MUSE_20180112_122850_57000</td>\n",
              "      <td>AF</td>\n",
              "      <td>STDD STTC</td>\n",
              "      <td>73</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>162</td>\n",
              "      <td>162</td>\n",
              "      <td>114</td>\n",
              "      <td>252</td>\n",
              "      <td>413</td>\n",
              "      <td>68</td>\n",
              "      <td>-40</td>\n",
              "      <td>26</td>\n",
              "      <td>228</td>\n",
              "      <td>285</td>\n",
              "      <td>354</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-69fd4b15-1b27-4109-8b59-07a303102b53')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-69fd4b15-1b27-4109-8b59-07a303102b53 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-69fd4b15-1b27-4109-8b59-07a303102b53');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-a3aca333-c022-48a9-8917-71b5c0407c5d\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-a3aca333-c022-48a9-8917-71b5c0407c5d')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-a3aca333-c022-48a9-8917-71b5c0407c5d button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df",
              "summary": "{\n  \"name\": \"df\",\n  \"rows\": 10646,\n  \"fields\": [\n    {\n      \"column\": \"FileName\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 10646,\n        \"samples\": [\n          \"MUSE_20180113_120154_01000\",\n          \"MUSE_20180712_154546_13000\",\n          \"MUSE_20180115_120656_35000\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Rhythm\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 11,\n        \"samples\": [\n          \"ST\",\n          \"AFIB\",\n          \"SAAWR\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Beat\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 742,\n        \"samples\": [\n          \"ALS AQW TWC\",\n          \"ARS CCR TWC\",\n          \"APB TWC VPB\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"PatientAge\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 18,\n        \"min\": 4,\n        \"max\": 98,\n        \"num_unique_values\": 95,\n        \"samples\": [\n          7,\n          18,\n          82\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Gender\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"FEMALE\",\n          \"MALE\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"VentricularRate\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 34,\n        \"min\": 34,\n        \"max\": 263,\n        \"num_unique_values\": 189,\n        \"samples\": [\n          195,\n          211\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"AtrialRate\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 60,\n        \"min\": 0,\n        \"max\": 535,\n        \"num_unique_values\": 253,\n        \"samples\": [\n          284,\n          86\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QRSDuration\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 17,\n        \"min\": 18,\n        \"max\": 256,\n        \"num_unique_values\": 80,\n        \"samples\": [\n          122,\n          114\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QTInterval\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 59,\n        \"min\": 114,\n        \"max\": 736,\n        \"num_unique_values\": 206,\n        \"samples\": [\n          440,\n          420\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QTCorrected\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 39,\n        \"min\": 219,\n        \"max\": 760,\n        \"num_unique_values\": 295,\n        \"samples\": [\n          332,\n          531\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"RAxis\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 41,\n        \"min\": -89,\n        \"max\": 270,\n        \"num_unique_values\": 277,\n        \"samples\": [\n          42,\n          -10\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"TAxis\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 57,\n        \"min\": -89,\n        \"max\": 270,\n        \"num_unique_values\": 356,\n        \"samples\": [\n          101,\n          36\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QRSCount\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 5,\n        \"min\": 5,\n        \"max\": 40,\n        \"num_unique_values\": 35,\n        \"samples\": [\n          36,\n          25\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QOnset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 6,\n        \"min\": 159,\n        \"max\": 240,\n        \"num_unique_values\": 62,\n        \"samples\": [\n          171,\n          170\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QOffset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 8,\n        \"min\": 249,\n        \"max\": 331,\n        \"num_unique_values\": 68,\n        \"samples\": [\n          283,\n          264\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"TOffset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 29,\n        \"min\": 281,\n        \"max\": 582,\n        \"num_unique_values\": 206,\n        \"samples\": [\n          421,\n          422\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 2
        }
      ],
      "source": [
        "!gdown 108Rg2FdrnQuh2O_klrQWalZI7orvN5fj\n",
        "df = pd.read_excel(\"/content/Diagnostics.xlsx\")\n",
        "df.head()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 443
        },
        "id": "QEi5DxmJgyth",
        "outputId": "30da44a9-26b1-40a2-cd3c-a947eff767ab"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "      Rhythm  PatientAge  Gender  VentricularRate  AtrialRate  QRSDuration  \\\n",
              "0       AFIB          85    MALE              117         234          114   \n",
              "1         SB          59  FEMALE               52          52           92   \n",
              "2         SA          20  FEMALE               67          67           82   \n",
              "3         SB          66    MALE               53          53           96   \n",
              "4         AF          73  FEMALE              162         162          114   \n",
              "...      ...         ...     ...              ...         ...          ...   \n",
              "10641    SVT          80  FEMALE              196          73          168   \n",
              "10642    SVT          81  FEMALE              162          81          162   \n",
              "10643    SVT          39    MALE              152          92          152   \n",
              "10644    SVT          76    MALE              175         178          128   \n",
              "10645    SVT          75    MALE              117         104          140   \n",
              "\n",
              "       QTInterval  QTCorrected  RAxis  TAxis  QRSCount  QOnset  QOffset  \\\n",
              "0             356          496     81    -27        19     208      265   \n",
              "1             432          401     76     42         8     215      261   \n",
              "2             382          403     88     20        11     224      265   \n",
              "3             456          427     34      3         9     219      267   \n",
              "4             252          413     68    -40        26     228      285   \n",
              "...           ...          ...    ...    ...       ...     ...      ...   \n",
              "10641         284          513    258    244        32     177      261   \n",
              "10642         294          482    110    -75        27     173      254   \n",
              "10643         340          540    250     38        25     208      284   \n",
              "10644         310          529     98    -83        29     205      269   \n",
              "10645         312          435    263    144        19     208      278   \n",
              "\n",
              "       TOffset  \n",
              "0          386  \n",
              "1          431  \n",
              "2          415  \n",
              "3          447  \n",
              "4          354  \n",
              "...        ...  \n",
              "10641      319  \n",
              "10642      320  \n",
              "10643      378  \n",
              "10644      360  \n",
              "10645      364  \n",
              "\n",
              "[10646 rows x 14 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-e6439ab9-bf45-4081-ad68-22e8a70f368c\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Rhythm</th>\n",
              "      <th>PatientAge</th>\n",
              "      <th>Gender</th>\n",
              "      <th>VentricularRate</th>\n",
              "      <th>AtrialRate</th>\n",
              "      <th>QRSDuration</th>\n",
              "      <th>QTInterval</th>\n",
              "      <th>QTCorrected</th>\n",
              "      <th>RAxis</th>\n",
              "      <th>TAxis</th>\n",
              "      <th>QRSCount</th>\n",
              "      <th>QOnset</th>\n",
              "      <th>QOffset</th>\n",
              "      <th>TOffset</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>AFIB</td>\n",
              "      <td>85</td>\n",
              "      <td>MALE</td>\n",
              "      <td>117</td>\n",
              "      <td>234</td>\n",
              "      <td>114</td>\n",
              "      <td>356</td>\n",
              "      <td>496</td>\n",
              "      <td>81</td>\n",
              "      <td>-27</td>\n",
              "      <td>19</td>\n",
              "      <td>208</td>\n",
              "      <td>265</td>\n",
              "      <td>386</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>SB</td>\n",
              "      <td>59</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>52</td>\n",
              "      <td>52</td>\n",
              "      <td>92</td>\n",
              "      <td>432</td>\n",
              "      <td>401</td>\n",
              "      <td>76</td>\n",
              "      <td>42</td>\n",
              "      <td>8</td>\n",
              "      <td>215</td>\n",
              "      <td>261</td>\n",
              "      <td>431</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>SA</td>\n",
              "      <td>20</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>67</td>\n",
              "      <td>67</td>\n",
              "      <td>82</td>\n",
              "      <td>382</td>\n",
              "      <td>403</td>\n",
              "      <td>88</td>\n",
              "      <td>20</td>\n",
              "      <td>11</td>\n",
              "      <td>224</td>\n",
              "      <td>265</td>\n",
              "      <td>415</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>SB</td>\n",
              "      <td>66</td>\n",
              "      <td>MALE</td>\n",
              "      <td>53</td>\n",
              "      <td>53</td>\n",
              "      <td>96</td>\n",
              "      <td>456</td>\n",
              "      <td>427</td>\n",
              "      <td>34</td>\n",
              "      <td>3</td>\n",
              "      <td>9</td>\n",
              "      <td>219</td>\n",
              "      <td>267</td>\n",
              "      <td>447</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>AF</td>\n",
              "      <td>73</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>162</td>\n",
              "      <td>162</td>\n",
              "      <td>114</td>\n",
              "      <td>252</td>\n",
              "      <td>413</td>\n",
              "      <td>68</td>\n",
              "      <td>-40</td>\n",
              "      <td>26</td>\n",
              "      <td>228</td>\n",
              "      <td>285</td>\n",
              "      <td>354</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10641</th>\n",
              "      <td>SVT</td>\n",
              "      <td>80</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>196</td>\n",
              "      <td>73</td>\n",
              "      <td>168</td>\n",
              "      <td>284</td>\n",
              "      <td>513</td>\n",
              "      <td>258</td>\n",
              "      <td>244</td>\n",
              "      <td>32</td>\n",
              "      <td>177</td>\n",
              "      <td>261</td>\n",
              "      <td>319</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10642</th>\n",
              "      <td>SVT</td>\n",
              "      <td>81</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>162</td>\n",
              "      <td>81</td>\n",
              "      <td>162</td>\n",
              "      <td>294</td>\n",
              "      <td>482</td>\n",
              "      <td>110</td>\n",
              "      <td>-75</td>\n",
              "      <td>27</td>\n",
              "      <td>173</td>\n",
              "      <td>254</td>\n",
              "      <td>320</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10643</th>\n",
              "      <td>SVT</td>\n",
              "      <td>39</td>\n",
              "      <td>MALE</td>\n",
              "      <td>152</td>\n",
              "      <td>92</td>\n",
              "      <td>152</td>\n",
              "      <td>340</td>\n",
              "      <td>540</td>\n",
              "      <td>250</td>\n",
              "      <td>38</td>\n",
              "      <td>25</td>\n",
              "      <td>208</td>\n",
              "      <td>284</td>\n",
              "      <td>378</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10644</th>\n",
              "      <td>SVT</td>\n",
              "      <td>76</td>\n",
              "      <td>MALE</td>\n",
              "      <td>175</td>\n",
              "      <td>178</td>\n",
              "      <td>128</td>\n",
              "      <td>310</td>\n",
              "      <td>529</td>\n",
              "      <td>98</td>\n",
              "      <td>-83</td>\n",
              "      <td>29</td>\n",
              "      <td>205</td>\n",
              "      <td>269</td>\n",
              "      <td>360</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10645</th>\n",
              "      <td>SVT</td>\n",
              "      <td>75</td>\n",
              "      <td>MALE</td>\n",
              "      <td>117</td>\n",
              "      <td>104</td>\n",
              "      <td>140</td>\n",
              "      <td>312</td>\n",
              "      <td>435</td>\n",
              "      <td>263</td>\n",
              "      <td>144</td>\n",
              "      <td>19</td>\n",
              "      <td>208</td>\n",
              "      <td>278</td>\n",
              "      <td>364</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>10646 rows × 14 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-e6439ab9-bf45-4081-ad68-22e8a70f368c')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-e6439ab9-bf45-4081-ad68-22e8a70f368c button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-e6439ab9-bf45-4081-ad68-22e8a70f368c');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-08a598d4-5e27-438f-8fc5-d3823037d375\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-08a598d4-5e27-438f-8fc5-d3823037d375')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-08a598d4-5e27-438f-8fc5-d3823037d375 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "  <div id=\"id_0bd4e9ed-ebea-490a-97ca-6990c5eca07e\">\n",
              "    <style>\n",
              "      .colab-df-generate {\n",
              "        background-color: #E8F0FE;\n",
              "        border: none;\n",
              "        border-radius: 50%;\n",
              "        cursor: pointer;\n",
              "        display: none;\n",
              "        fill: #1967D2;\n",
              "        height: 32px;\n",
              "        padding: 0 0 0 0;\n",
              "        width: 32px;\n",
              "      }\n",
              "\n",
              "      .colab-df-generate:hover {\n",
              "        background-color: #E2EBFA;\n",
              "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "        fill: #174EA6;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate:hover {\n",
              "        background-color: #434B5C;\n",
              "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "        fill: #FFFFFF;\n",
              "      }\n",
              "    </style>\n",
              "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('df_1')\"\n",
              "            title=\"Generate code using this dataframe.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "    <script>\n",
              "      (() => {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_0bd4e9ed-ebea-490a-97ca-6990c5eca07e button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () => {\n",
              "        google.colab.notebook.generateWithVariable('df_1');\n",
              "      }\n",
              "      })();\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df_1",
              "summary": "{\n  \"name\": \"df_1\",\n  \"rows\": 10646,\n  \"fields\": [\n    {\n      \"column\": \"Rhythm\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 11,\n        \"samples\": [\n          \"ST\",\n          \"AFIB\",\n          \"SAAWR\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"PatientAge\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 18,\n        \"min\": 4,\n        \"max\": 98,\n        \"num_unique_values\": 95,\n        \"samples\": [\n          7,\n          18,\n          82\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Gender\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"FEMALE\",\n          \"MALE\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"VentricularRate\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 34,\n        \"min\": 34,\n        \"max\": 263,\n        \"num_unique_values\": 189,\n        \"samples\": [\n          195,\n          211\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"AtrialRate\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 60,\n        \"min\": 0,\n        \"max\": 535,\n        \"num_unique_values\": 253,\n        \"samples\": [\n          284,\n          86\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QRSDuration\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 17,\n        \"min\": 18,\n        \"max\": 256,\n        \"num_unique_values\": 80,\n        \"samples\": [\n          122,\n          114\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QTInterval\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 59,\n        \"min\": 114,\n        \"max\": 736,\n        \"num_unique_values\": 206,\n        \"samples\": [\n          440,\n          420\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QTCorrected\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 39,\n        \"min\": 219,\n        \"max\": 760,\n        \"num_unique_values\": 295,\n        \"samples\": [\n          332,\n          531\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"RAxis\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 41,\n        \"min\": -89,\n        \"max\": 270,\n        \"num_unique_values\": 277,\n        \"samples\": [\n          42,\n          -10\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"TAxis\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 57,\n        \"min\": -89,\n        \"max\": 270,\n        \"num_unique_values\": 356,\n        \"samples\": [\n          101,\n          36\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QRSCount\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 5,\n        \"min\": 5,\n        \"max\": 40,\n        \"num_unique_values\": 35,\n        \"samples\": [\n          36,\n          25\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QOnset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 6,\n        \"min\": 159,\n        \"max\": 240,\n        \"num_unique_values\": 62,\n        \"samples\": [\n          171,\n          170\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QOffset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 8,\n        \"min\": 249,\n        \"max\": 331,\n        \"num_unique_values\": 68,\n        \"samples\": [\n          283,\n          264\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"TOffset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 29,\n        \"min\": 281,\n        \"max\": 582,\n        \"num_unique_values\": 206,\n        \"samples\": [\n          421,\n          422\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 3
        }
      ],
      "source": [
        "df_1 = df.drop(columns=['FileName', 'Beat'])\n",
        "df_1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 478
        },
        "id": "VL0Tq04olynz",
        "outputId": "86e4a7f3-03e7-4b69-9970-7280ab742fab"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "<ipython-input-4-1cbd04af9b7c>:1: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`\n",
            "  df_1['Rhythm'] = df['Rhythm'].replace({\"AF\":0, \"AFIB\":0, \"SVT\":1, \"AT\":1, \"SAAWR\":1, \"ST\":1,\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "       Rhythm  PatientAge  Gender  VentricularRate  AtrialRate  QRSDuration  \\\n",
              "0           0          85    MALE              117         234          114   \n",
              "1           2          59  FEMALE               52          52           92   \n",
              "2           3          20  FEMALE               67          67           82   \n",
              "3           2          66    MALE               53          53           96   \n",
              "4           0          73  FEMALE              162         162          114   \n",
              "...       ...         ...     ...              ...         ...          ...   \n",
              "10641       1          80  FEMALE              196          73          168   \n",
              "10642       1          81  FEMALE              162          81          162   \n",
              "10643       1          39    MALE              152          92          152   \n",
              "10644       1          76    MALE              175         178          128   \n",
              "10645       1          75    MALE              117         104          140   \n",
              "\n",
              "       QTInterval  QTCorrected  RAxis  TAxis  QRSCount  QOnset  QOffset  \\\n",
              "0             356          496     81    -27        19     208      265   \n",
              "1             432          401     76     42         8     215      261   \n",
              "2             382          403     88     20        11     224      265   \n",
              "3             456          427     34      3         9     219      267   \n",
              "4             252          413     68    -40        26     228      285   \n",
              "...           ...          ...    ...    ...       ...     ...      ...   \n",
              "10641         284          513    258    244        32     177      261   \n",
              "10642         294          482    110    -75        27     173      254   \n",
              "10643         340          540    250     38        25     208      284   \n",
              "10644         310          529     98    -83        29     205      269   \n",
              "10645         312          435    263    144        19     208      278   \n",
              "\n",
              "       TOffset  \n",
              "0          386  \n",
              "1          431  \n",
              "2          415  \n",
              "3          447  \n",
              "4          354  \n",
              "...        ...  \n",
              "10641      319  \n",
              "10642      320  \n",
              "10643      378  \n",
              "10644      360  \n",
              "10645      364  \n",
              "\n",
              "[10646 rows x 14 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-827b432a-b4c2-4b45-ab7e-0ad7fefd7f3c\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Rhythm</th>\n",
              "      <th>PatientAge</th>\n",
              "      <th>Gender</th>\n",
              "      <th>VentricularRate</th>\n",
              "      <th>AtrialRate</th>\n",
              "      <th>QRSDuration</th>\n",
              "      <th>QTInterval</th>\n",
              "      <th>QTCorrected</th>\n",
              "      <th>RAxis</th>\n",
              "      <th>TAxis</th>\n",
              "      <th>QRSCount</th>\n",
              "      <th>QOnset</th>\n",
              "      <th>QOffset</th>\n",
              "      <th>TOffset</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0</td>\n",
              "      <td>85</td>\n",
              "      <td>MALE</td>\n",
              "      <td>117</td>\n",
              "      <td>234</td>\n",
              "      <td>114</td>\n",
              "      <td>356</td>\n",
              "      <td>496</td>\n",
              "      <td>81</td>\n",
              "      <td>-27</td>\n",
              "      <td>19</td>\n",
              "      <td>208</td>\n",
              "      <td>265</td>\n",
              "      <td>386</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>2</td>\n",
              "      <td>59</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>52</td>\n",
              "      <td>52</td>\n",
              "      <td>92</td>\n",
              "      <td>432</td>\n",
              "      <td>401</td>\n",
              "      <td>76</td>\n",
              "      <td>42</td>\n",
              "      <td>8</td>\n",
              "      <td>215</td>\n",
              "      <td>261</td>\n",
              "      <td>431</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>3</td>\n",
              "      <td>20</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>67</td>\n",
              "      <td>67</td>\n",
              "      <td>82</td>\n",
              "      <td>382</td>\n",
              "      <td>403</td>\n",
              "      <td>88</td>\n",
              "      <td>20</td>\n",
              "      <td>11</td>\n",
              "      <td>224</td>\n",
              "      <td>265</td>\n",
              "      <td>415</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>2</td>\n",
              "      <td>66</td>\n",
              "      <td>MALE</td>\n",
              "      <td>53</td>\n",
              "      <td>53</td>\n",
              "      <td>96</td>\n",
              "      <td>456</td>\n",
              "      <td>427</td>\n",
              "      <td>34</td>\n",
              "      <td>3</td>\n",
              "      <td>9</td>\n",
              "      <td>219</td>\n",
              "      <td>267</td>\n",
              "      <td>447</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0</td>\n",
              "      <td>73</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>162</td>\n",
              "      <td>162</td>\n",
              "      <td>114</td>\n",
              "      <td>252</td>\n",
              "      <td>413</td>\n",
              "      <td>68</td>\n",
              "      <td>-40</td>\n",
              "      <td>26</td>\n",
              "      <td>228</td>\n",
              "      <td>285</td>\n",
              "      <td>354</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10641</th>\n",
              "      <td>1</td>\n",
              "      <td>80</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>196</td>\n",
              "      <td>73</td>\n",
              "      <td>168</td>\n",
              "      <td>284</td>\n",
              "      <td>513</td>\n",
              "      <td>258</td>\n",
              "      <td>244</td>\n",
              "      <td>32</td>\n",
              "      <td>177</td>\n",
              "      <td>261</td>\n",
              "      <td>319</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10642</th>\n",
              "      <td>1</td>\n",
              "      <td>81</td>\n",
              "      <td>FEMALE</td>\n",
              "      <td>162</td>\n",
              "      <td>81</td>\n",
              "      <td>162</td>\n",
              "      <td>294</td>\n",
              "      <td>482</td>\n",
              "      <td>110</td>\n",
              "      <td>-75</td>\n",
              "      <td>27</td>\n",
              "      <td>173</td>\n",
              "      <td>254</td>\n",
              "      <td>320</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10643</th>\n",
              "      <td>1</td>\n",
              "      <td>39</td>\n",
              "      <td>MALE</td>\n",
              "      <td>152</td>\n",
              "      <td>92</td>\n",
              "      <td>152</td>\n",
              "      <td>340</td>\n",
              "      <td>540</td>\n",
              "      <td>250</td>\n",
              "      <td>38</td>\n",
              "      <td>25</td>\n",
              "      <td>208</td>\n",
              "      <td>284</td>\n",
              "      <td>378</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10644</th>\n",
              "      <td>1</td>\n",
              "      <td>76</td>\n",
              "      <td>MALE</td>\n",
              "      <td>175</td>\n",
              "      <td>178</td>\n",
              "      <td>128</td>\n",
              "      <td>310</td>\n",
              "      <td>529</td>\n",
              "      <td>98</td>\n",
              "      <td>-83</td>\n",
              "      <td>29</td>\n",
              "      <td>205</td>\n",
              "      <td>269</td>\n",
              "      <td>360</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10645</th>\n",
              "      <td>1</td>\n",
              "      <td>75</td>\n",
              "      <td>MALE</td>\n",
              "      <td>117</td>\n",
              "      <td>104</td>\n",
              "      <td>140</td>\n",
              "      <td>312</td>\n",
              "      <td>435</td>\n",
              "      <td>263</td>\n",
              "      <td>144</td>\n",
              "      <td>19</td>\n",
              "      <td>208</td>\n",
              "      <td>278</td>\n",
              "      <td>364</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>10646 rows × 14 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-827b432a-b4c2-4b45-ab7e-0ad7fefd7f3c')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-827b432a-b4c2-4b45-ab7e-0ad7fefd7f3c button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-827b432a-b4c2-4b45-ab7e-0ad7fefd7f3c');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-9e3615bd-64e4-4d11-a367-b245e9ac9ed9\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-9e3615bd-64e4-4d11-a367-b245e9ac9ed9')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-9e3615bd-64e4-4d11-a367-b245e9ac9ed9 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "  <div id=\"id_30a871b1-2f1e-4e16-b6c1-77c4961ff52b\">\n",
              "    <style>\n",
              "      .colab-df-generate {\n",
              "        background-color: #E8F0FE;\n",
              "        border: none;\n",
              "        border-radius: 50%;\n",
              "        cursor: pointer;\n",
              "        display: none;\n",
              "        fill: #1967D2;\n",
              "        height: 32px;\n",
              "        padding: 0 0 0 0;\n",
              "        width: 32px;\n",
              "      }\n",
              "\n",
              "      .colab-df-generate:hover {\n",
              "        background-color: #E2EBFA;\n",
              "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "        fill: #174EA6;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate:hover {\n",
              "        background-color: #434B5C;\n",
              "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "        fill: #FFFFFF;\n",
              "      }\n",
              "    </style>\n",
              "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('df_1')\"\n",
              "            title=\"Generate code using this dataframe.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "    <script>\n",
              "      (() => {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_30a871b1-2f1e-4e16-b6c1-77c4961ff52b button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () => {\n",
              "        google.colab.notebook.generateWithVariable('df_1');\n",
              "      }\n",
              "      })();\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df_1",
              "summary": "{\n  \"name\": \"df_1\",\n  \"rows\": 10646,\n  \"fields\": [\n    {\n      \"column\": \"Rhythm\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1,\n        \"min\": 0,\n        \"max\": 3,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          2,\n          1,\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"PatientAge\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 18,\n        \"min\": 4,\n        \"max\": 98,\n        \"num_unique_values\": 95,\n        \"samples\": [\n          7,\n          18,\n          82\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Gender\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"FEMALE\",\n          \"MALE\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"VentricularRate\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 34,\n        \"min\": 34,\n        \"max\": 263,\n        \"num_unique_values\": 189,\n        \"samples\": [\n          195,\n          211\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"AtrialRate\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 60,\n        \"min\": 0,\n        \"max\": 535,\n        \"num_unique_values\": 253,\n        \"samples\": [\n          284,\n          86\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QRSDuration\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 17,\n        \"min\": 18,\n        \"max\": 256,\n        \"num_unique_values\": 80,\n        \"samples\": [\n          122,\n          114\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QTInterval\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 59,\n        \"min\": 114,\n        \"max\": 736,\n        \"num_unique_values\": 206,\n        \"samples\": [\n          440,\n          420\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QTCorrected\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 39,\n        \"min\": 219,\n        \"max\": 760,\n        \"num_unique_values\": 295,\n        \"samples\": [\n          332,\n          531\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"RAxis\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 41,\n        \"min\": -89,\n        \"max\": 270,\n        \"num_unique_values\": 277,\n        \"samples\": [\n          42,\n          -10\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"TAxis\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 57,\n        \"min\": -89,\n        \"max\": 270,\n        \"num_unique_values\": 356,\n        \"samples\": [\n          101,\n          36\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QRSCount\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 5,\n        \"min\": 5,\n        \"max\": 40,\n        \"num_unique_values\": 35,\n        \"samples\": [\n          36,\n          25\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QOnset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 6,\n        \"min\": 159,\n        \"max\": 240,\n        \"num_unique_values\": 62,\n        \"samples\": [\n          171,\n          170\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QOffset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 8,\n        \"min\": 249,\n        \"max\": 331,\n        \"num_unique_values\": 68,\n        \"samples\": [\n          283,\n          264\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"TOffset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 29,\n        \"min\": 281,\n        \"max\": 582,\n        \"num_unique_values\": 206,\n        \"samples\": [\n          421,\n          422\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 4
        }
      ],
      "source": [
        "df_1['Rhythm'] = df['Rhythm'].replace({\"AF\":0, \"AFIB\":0, \"SVT\":1, \"AT\":1, \"SAAWR\":1, \"ST\":1,\n",
        "\"AVNRT\":1, \"AVRT\":1, \"SB\":2, \"SA\":3, \"SR\":3})\n",
        "df_1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 443
        },
        "id": "Cfdr55TLz8j9",
        "outputId": "80df0f5f-c9a4-430e-e6d2-d63b54a99e9f"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "       Rhythm  PatientAge  VentricularRate  AtrialRate  QRSDuration  \\\n",
              "0           0          85              117         234          114   \n",
              "1           2          59               52          52           92   \n",
              "2           3          20               67          67           82   \n",
              "3           2          66               53          53           96   \n",
              "4           0          73              162         162          114   \n",
              "...       ...         ...              ...         ...          ...   \n",
              "10641       1          80              196          73          168   \n",
              "10642       1          81              162          81          162   \n",
              "10643       1          39              152          92          152   \n",
              "10644       1          76              175         178          128   \n",
              "10645       1          75              117         104          140   \n",
              "\n",
              "       QTInterval  QTCorrected  RAxis  TAxis  QRSCount  QOnset  QOffset  \\\n",
              "0             356          496     81    -27        19     208      265   \n",
              "1             432          401     76     42         8     215      261   \n",
              "2             382          403     88     20        11     224      265   \n",
              "3             456          427     34      3         9     219      267   \n",
              "4             252          413     68    -40        26     228      285   \n",
              "...           ...          ...    ...    ...       ...     ...      ...   \n",
              "10641         284          513    258    244        32     177      261   \n",
              "10642         294          482    110    -75        27     173      254   \n",
              "10643         340          540    250     38        25     208      284   \n",
              "10644         310          529     98    -83        29     205      269   \n",
              "10645         312          435    263    144        19     208      278   \n",
              "\n",
              "       TOffset  Gender_MALE  \n",
              "0          386          1.0  \n",
              "1          431          0.0  \n",
              "2          415          0.0  \n",
              "3          447          1.0  \n",
              "4          354          0.0  \n",
              "...        ...          ...  \n",
              "10641      319          0.0  \n",
              "10642      320          0.0  \n",
              "10643      378          1.0  \n",
              "10644      360          1.0  \n",
              "10645      364          1.0  \n",
              "\n",
              "[10646 rows x 14 columns]"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-8dfcaa62-5a6e-4295-8519-e4c4243c0c97\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Rhythm</th>\n",
              "      <th>PatientAge</th>\n",
              "      <th>VentricularRate</th>\n",
              "      <th>AtrialRate</th>\n",
              "      <th>QRSDuration</th>\n",
              "      <th>QTInterval</th>\n",
              "      <th>QTCorrected</th>\n",
              "      <th>RAxis</th>\n",
              "      <th>TAxis</th>\n",
              "      <th>QRSCount</th>\n",
              "      <th>QOnset</th>\n",
              "      <th>QOffset</th>\n",
              "      <th>TOffset</th>\n",
              "      <th>Gender_MALE</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0</td>\n",
              "      <td>85</td>\n",
              "      <td>117</td>\n",
              "      <td>234</td>\n",
              "      <td>114</td>\n",
              "      <td>356</td>\n",
              "      <td>496</td>\n",
              "      <td>81</td>\n",
              "      <td>-27</td>\n",
              "      <td>19</td>\n",
              "      <td>208</td>\n",
              "      <td>265</td>\n",
              "      <td>386</td>\n",
              "      <td>1.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>2</td>\n",
              "      <td>59</td>\n",
              "      <td>52</td>\n",
              "      <td>52</td>\n",
              "      <td>92</td>\n",
              "      <td>432</td>\n",
              "      <td>401</td>\n",
              "      <td>76</td>\n",
              "      <td>42</td>\n",
              "      <td>8</td>\n",
              "      <td>215</td>\n",
              "      <td>261</td>\n",
              "      <td>431</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>3</td>\n",
              "      <td>20</td>\n",
              "      <td>67</td>\n",
              "      <td>67</td>\n",
              "      <td>82</td>\n",
              "      <td>382</td>\n",
              "      <td>403</td>\n",
              "      <td>88</td>\n",
              "      <td>20</td>\n",
              "      <td>11</td>\n",
              "      <td>224</td>\n",
              "      <td>265</td>\n",
              "      <td>415</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>2</td>\n",
              "      <td>66</td>\n",
              "      <td>53</td>\n",
              "      <td>53</td>\n",
              "      <td>96</td>\n",
              "      <td>456</td>\n",
              "      <td>427</td>\n",
              "      <td>34</td>\n",
              "      <td>3</td>\n",
              "      <td>9</td>\n",
              "      <td>219</td>\n",
              "      <td>267</td>\n",
              "      <td>447</td>\n",
              "      <td>1.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0</td>\n",
              "      <td>73</td>\n",
              "      <td>162</td>\n",
              "      <td>162</td>\n",
              "      <td>114</td>\n",
              "      <td>252</td>\n",
              "      <td>413</td>\n",
              "      <td>68</td>\n",
              "      <td>-40</td>\n",
              "      <td>26</td>\n",
              "      <td>228</td>\n",
              "      <td>285</td>\n",
              "      <td>354</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10641</th>\n",
              "      <td>1</td>\n",
              "      <td>80</td>\n",
              "      <td>196</td>\n",
              "      <td>73</td>\n",
              "      <td>168</td>\n",
              "      <td>284</td>\n",
              "      <td>513</td>\n",
              "      <td>258</td>\n",
              "      <td>244</td>\n",
              "      <td>32</td>\n",
              "      <td>177</td>\n",
              "      <td>261</td>\n",
              "      <td>319</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10642</th>\n",
              "      <td>1</td>\n",
              "      <td>81</td>\n",
              "      <td>162</td>\n",
              "      <td>81</td>\n",
              "      <td>162</td>\n",
              "      <td>294</td>\n",
              "      <td>482</td>\n",
              "      <td>110</td>\n",
              "      <td>-75</td>\n",
              "      <td>27</td>\n",
              "      <td>173</td>\n",
              "      <td>254</td>\n",
              "      <td>320</td>\n",
              "      <td>0.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10643</th>\n",
              "      <td>1</td>\n",
              "      <td>39</td>\n",
              "      <td>152</td>\n",
              "      <td>92</td>\n",
              "      <td>152</td>\n",
              "      <td>340</td>\n",
              "      <td>540</td>\n",
              "      <td>250</td>\n",
              "      <td>38</td>\n",
              "      <td>25</td>\n",
              "      <td>208</td>\n",
              "      <td>284</td>\n",
              "      <td>378</td>\n",
              "      <td>1.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10644</th>\n",
              "      <td>1</td>\n",
              "      <td>76</td>\n",
              "      <td>175</td>\n",
              "      <td>178</td>\n",
              "      <td>128</td>\n",
              "      <td>310</td>\n",
              "      <td>529</td>\n",
              "      <td>98</td>\n",
              "      <td>-83</td>\n",
              "      <td>29</td>\n",
              "      <td>205</td>\n",
              "      <td>269</td>\n",
              "      <td>360</td>\n",
              "      <td>1.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10645</th>\n",
              "      <td>1</td>\n",
              "      <td>75</td>\n",
              "      <td>117</td>\n",
              "      <td>104</td>\n",
              "      <td>140</td>\n",
              "      <td>312</td>\n",
              "      <td>435</td>\n",
              "      <td>263</td>\n",
              "      <td>144</td>\n",
              "      <td>19</td>\n",
              "      <td>208</td>\n",
              "      <td>278</td>\n",
              "      <td>364</td>\n",
              "      <td>1.0</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>10646 rows × 14 columns</p>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-8dfcaa62-5a6e-4295-8519-e4c4243c0c97')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-8dfcaa62-5a6e-4295-8519-e4c4243c0c97 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-8dfcaa62-5a6e-4295-8519-e4c4243c0c97');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-9149c6bf-f485-4faf-817a-67176cce1883\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-9149c6bf-f485-4faf-817a-67176cce1883')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-9149c6bf-f485-4faf-817a-67176cce1883 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "  <div id=\"id_6b11af5a-652b-4d00-b415-2e6d6168c2dd\">\n",
              "    <style>\n",
              "      .colab-df-generate {\n",
              "        background-color: #E8F0FE;\n",
              "        border: none;\n",
              "        border-radius: 50%;\n",
              "        cursor: pointer;\n",
              "        display: none;\n",
              "        fill: #1967D2;\n",
              "        height: 32px;\n",
              "        padding: 0 0 0 0;\n",
              "        width: 32px;\n",
              "      }\n",
              "\n",
              "      .colab-df-generate:hover {\n",
              "        background-color: #E2EBFA;\n",
              "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "        fill: #174EA6;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate:hover {\n",
              "        background-color: #434B5C;\n",
              "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "        fill: #FFFFFF;\n",
              "      }\n",
              "    </style>\n",
              "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('df_1')\"\n",
              "            title=\"Generate code using this dataframe.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "    <script>\n",
              "      (() => {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_6b11af5a-652b-4d00-b415-2e6d6168c2dd button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () => {\n",
              "        google.colab.notebook.generateWithVariable('df_1');\n",
              "      }\n",
              "      })();\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df_1",
              "summary": "{\n  \"name\": \"df_1\",\n  \"rows\": 10646,\n  \"fields\": [\n    {\n      \"column\": \"Rhythm\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1,\n        \"min\": 0,\n        \"max\": 3,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          2,\n          1,\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"PatientAge\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 18,\n        \"min\": 4,\n        \"max\": 98,\n        \"num_unique_values\": 95,\n        \"samples\": [\n          7,\n          18,\n          82\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"VentricularRate\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 34,\n        \"min\": 34,\n        \"max\": 263,\n        \"num_unique_values\": 189,\n        \"samples\": [\n          195,\n          211,\n          60\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"AtrialRate\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 60,\n        \"min\": 0,\n        \"max\": 535,\n        \"num_unique_values\": 253,\n        \"samples\": [\n          284,\n          86,\n          48\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QRSDuration\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 17,\n        \"min\": 18,\n        \"max\": 256,\n        \"num_unique_values\": 80,\n        \"samples\": [\n          122,\n          114,\n          72\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QTInterval\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 59,\n        \"min\": 114,\n        \"max\": 736,\n        \"num_unique_values\": 206,\n        \"samples\": [\n          440,\n          420,\n          176\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QTCorrected\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 39,\n        \"min\": 219,\n        \"max\": 760,\n        \"num_unique_values\": 295,\n        \"samples\": [\n          332,\n          531,\n          421\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"RAxis\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 41,\n        \"min\": -89,\n        \"max\": 270,\n        \"num_unique_values\": 277,\n        \"samples\": [\n          42,\n          -10,\n          -65\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"TAxis\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 57,\n        \"min\": -89,\n        \"max\": 270,\n        \"num_unique_values\": 356,\n        \"samples\": [\n          101,\n          36,\n          98\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QRSCount\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 5,\n        \"min\": 5,\n        \"max\": 40,\n        \"num_unique_values\": 35,\n        \"samples\": [\n          36,\n          25,\n          31\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QOnset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 6,\n        \"min\": 159,\n        \"max\": 240,\n        \"num_unique_values\": 62,\n        \"samples\": [\n          171,\n          170,\n          208\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"QOffset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 8,\n        \"min\": 249,\n        \"max\": 331,\n        \"num_unique_values\": 68,\n        \"samples\": [\n          283,\n          264,\n          260\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"TOffset\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 29,\n        \"min\": 281,\n        \"max\": 582,\n        \"num_unique_values\": 206,\n        \"samples\": [\n          421,\n          422,\n          318\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Gender_MALE\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4964753630841413,\n        \"min\": 0.0,\n        \"max\": 1.0,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0,\n          1.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 5
        }
      ],
      "source": [
        "from sklearn.preprocessing import OneHotEncoder, MinMaxScaler\n",
        "\n",
        "encoder = OneHotEncoder(sparse_output=False)\n",
        "\n",
        "one_hot = encoder.fit_transform(df_1[['Gender']])\n",
        "\n",
        "df_encoded = pd.DataFrame(one_hot, columns=encoder.get_feature_names_out(['Gender']))\n",
        "\n",
        "# Concatenazione con il DataFrame originale\n",
        "df_1 = pd.concat([df_1, df_encoded], axis=1)\n",
        "\n",
        "df_1 = df_1.drop(columns=['Gender', \"Gender_FEMALE\"])\n",
        "\n",
        "df_1"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "id": "lhfiso9khzKR"
      },
      "outputs": [],
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "X = df_1.drop(columns=[\"Rhythm\"])\n",
        "y = df_1[\"Rhythm\"]\n",
        "\n",
        "X_train, X_test, y_train, y_test = train_test_split(X,\n",
        "                                                    y,\n",
        "                                                    test_size=0.3, # train:test ratio 7:3\n",
        "                                                    stratify=y, # grants equal labels division\n",
        "                                                    random_state = 13)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "id": "pE2L6J66pGNy"
      },
      "outputs": [],
      "source": [
        "scaler = MinMaxScaler(feature_range=(0, 1))\n",
        "X_scaled = scaler.fit_transform(X_train)\n",
        "\n",
        "X_scaled = pd.DataFrame(X_scaled, columns=X_train.columns, index=X_train.index)  # Keep original columns and index"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "id": "Q4AYAsx51dsX"
      },
      "outputs": [],
      "source": [
        "X_scaled_test = scaler.transform(X_test)\n",
        "# Convert the scaled NumPy array back to a pandas DataFrame\n",
        "X_scaled_test = pd.DataFrame(X_scaled_test, columns=X_test.columns, index=X_test.index)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 27,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 491
        },
        "id": "YanGB1LP1_0v",
        "outputId": "c5845087-1073-4089-b3cd-57c99ad3d3e6"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "PatientAge         0.553191\n",
              "VentricularRate    0.628571\n",
              "AtrialRate         0.824299\n",
              "QRSDuration        0.193277\n",
              "QTInterval         0.250804\n",
              "QTCorrected        0.423290\n",
              "RAxis              0.401114\n",
              "TAxis              0.415042\n",
              "QRSCount           0.647059\n",
              "QOnset             0.814815\n",
              "QOffset            0.097561\n",
              "TOffset            0.262458\n",
              "Gender_MALE        1.000000\n",
              "Name: 333, dtype: float64"
            ],
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>333</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>PatientAge</th>\n",
              "      <td>0.553191</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>VentricularRate</th>\n",
              "      <td>0.628571</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>AtrialRate</th>\n",
              "      <td>0.824299</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>QRSDuration</th>\n",
              "      <td>0.193277</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>QTInterval</th>\n",
              "      <td>0.250804</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>QTCorrected</th>\n",
              "      <td>0.423290</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>RAxis</th>\n",
              "      <td>0.401114</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>TAxis</th>\n",
              "      <td>0.415042</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>QRSCount</th>\n",
              "      <td>0.647059</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>QOnset</th>\n",
              "      <td>0.814815</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>QOffset</th>\n",
              "      <td>0.097561</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>TOffset</th>\n",
              "      <td>0.262458</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>Gender_MALE</th>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div><br><label><b>dtype:</b> float64</label>"
            ]
          },
          "metadata": {},
          "execution_count": 27
        }
      ],
      "source": [
        "X_scaled.iloc[0]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "id": "wSwkVRCV2Rti"
      },
      "outputs": [],
      "source": [
        "def create_model(nhid1=100,\n",
        "                 nhid2=50,\n",
        "                 num_layers=2,\n",
        "                 learning_rate=0.001,\n",
        "                 dropout_rate=0,\n",
        "                 hid_act='leaky_relu',\n",
        "                 loss='sparse_categorical_crossentropy'):\n",
        "\n",
        "    model = Sequential()\n",
        "    model.add(Dense(nhid1, input_shape=(13,), activation=hid_act)) # If you remove beat, shape = 13\n",
        "    for _ in range(num_layers - 1):\n",
        "        model.add(BatchNormalization())\n",
        "        model.add(Dense(nhid2, activation=hid_act))\n",
        "        model.add(Dropout(dropout_rate))\n",
        "    model.add(Dense(4, activation='softmax'))\n",
        "    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate),\n",
        "                  loss=loss)\n",
        "\n",
        "    return model"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "850MwNkA3bqo",
        "outputId": "ac8aa4fb-87cb-4746-a8a3-60516859102c"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.11/dist-packages/keras/src/layers/core/dense.py:87: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
            "  super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[1m100/100\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step\n",
            "0.8469004383218535\n"
          ]
        }
      ],
      "source": [
        "from sklearn.metrics import accuracy_score\n",
        "\n",
        "# Sanity Check\n",
        "model = create_model()\n",
        "model.fit(X_scaled, y_train, epochs=10, batch_size=16, verbose=0)\n",
        "\n",
        "pred = model.predict(X_scaled_test)\n",
        "pred_labels = np.argmax(pred, axis=1)\n",
        "acc = accuracy_score(y_test, pred_labels)\n",
        "\n",
        "print(acc)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "YxuLUyGks4aU"
      },
      "outputs": [],
      "source": [
        "import tensorflow as tf\n",
        "if len(tf.config.list_physical_devices('GPU')) == 0:\n",
        "  raise SystemError('GPU device not found')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "yLA2EFUqhDeH",
        "outputId": "5380e10f-ce7e-4d86-8ff2-77504a447f0f"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[1m117/117\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step\n",
            "\u001b[1m117/117\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step\n",
            "Configuration: (n_units, n_units2, layers, l_rates, d_rates, batches): (100, 50, 4, 0.001, 0.1, 16) -> mean F1-macro score: 0.8557391712806832\n",
            "\u001b[1m117/117\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 5ms/step\n",
            "\u001b[1m117/117\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step\n",
            "Configuration: (n_units, n_units2, layers, l_rates, d_rates, batches): (100, 50, 4, 0.001, 0.15, 16) -> mean F1-macro score: 0.8099323563097319\n",
            "\u001b[1m117/117\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step\n",
            "\u001b[1m117/117\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step\n",
            "Configuration: (n_units, n_units2, layers, l_rates, d_rates, batches): (100, 50, 4, 0.008, 0.1, 16) -> mean F1-macro score: 0.8118863465453189\n",
            "\u001b[1m117/117\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step\n",
            "\u001b[1m117/117\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step\n",
            "Configuration: (n_units, n_units2, layers, l_rates, d_rates, batches): (100, 50, 4, 0.008, 0.15, 16) -> mean F1-macro score: 0.7926885371898349\n",
            "\u001b[1m117/117\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step\n",
            "\u001b[1m117/117\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step\n",
            "Configuration: (n_units, n_units2, layers, l_rates, d_rates, batches): (100, 50, 4, 0.0001, 0.1, 16) -> mean F1-macro score: 0.829686267961691\n",
            "\u001b[1m117/117\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 3ms/step\n",
            "\u001b[1m117/117\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step\n",
            "Configuration: (n_units, n_units2, layers, l_rates, d_rates, batches): (100, 50, 4, 0.0001, 0.15, 16) -> mean F1-macro score: 0.817305955059219\n",
            "Max mean F1-macro score: 0.8557391712806832 with configuration (100, 50, 4, 0.001, 0.1, 16)\n"
          ]
        }
      ],
      "source": [
        "warnings.filterwarnings('ignore')\n",
        "\n",
        "nhid1 = [100]\n",
        "nhid2 = [50]\n",
        "num_layers = [4]\n",
        "lr = [10**-3]\n",
        "batch_size = [16]\n",
        "dropout_rate = [0.1]\n",
        "\n",
        "k_folds = 2\n",
        "\n",
        "max_f1_score = -1\n",
        "max_f1_model_config = None\n",
        "\n",
        "for n_units, n_units2, layers, batches, l_rates, d_rates in itertools.product(nhid1, nhid2, num_layers, batch_size, lr, dropout_rate):\n",
        "\n",
        "    fold_f1_scores = []\n",
        "    kf = KFold(n_splits=k_folds, shuffle=True, random_state=13)\n",
        "\n",
        "    for train_index, val_index in kf.split(X_scaled):\n",
        "        X_train_fold, X_val_fold = X_scaled.iloc[train_index], X_scaled.iloc[val_index]\n",
        "        y_train_fold, y_val_fold = y_train.iloc[train_index], y_train.iloc[val_index]\n",
        "\n",
        "        model = create_model(n_units, n_units2, layers, l_rates, d_rates, hid_act='relu', loss='sparse_categorical_crossentropy')\n",
        "        model.fit(X_train_fold, y_train_fold, epochs=50, batch_size=batches, verbose=0)\n",
        "\n",
        "        pred = model.predict(X_val_fold)\n",
        "        pred_labels = np.argmax(pred, axis=1)\n",
        "\n",
        "        f1_macro = f1_score(y_val_fold, pred_labels, average='macro')\n",
        "        fold_f1_scores.append(f1_macro)\n",
        "\n",
        "    mean_f1_score = np.mean(fold_f1_scores)\n",
        "    print(f\"Configuration: (n_units, n_units2, layers, l_rates, d_rates, batches): \"\n",
        "          f\"{(n_units, n_units2, layers, l_rates, d_rates, batches)} -> mean F1-macro score: {mean_f1_score}\")\n",
        "\n",
        "    if mean_f1_score > max_f1_score:\n",
        "        max_f1_score = mean_f1_score\n",
        "        max_f1_model_config = (n_units, n_units2, layers, l_rates, d_rates, batches)\n",
        "\n",
        "print(f\"Max mean F1-macro score: {max_f1_score} with configuration {max_f1_model_config}\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "7lrX9t-fgG3C",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 141
        },
        "outputId": "801dce7b-f32d-4b2e-f4c7-fe371f9da7ca"
      },
      "outputs": [
        {
          "output_type": "error",
          "ename": "NameError",
          "evalue": "name 'max_f1_model_config' is not defined",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-10-4ce3929b216a>\u001b[0m in \u001b[0;36m<cell line: 0>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdill\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmax_f1_model_config\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'model.pkl'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'wb'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
            "\u001b[0;31mNameError\u001b[0m: name 'max_f1_model_config' is not defined"
          ]
        }
      ],
      "source": [
        "dill.dump(max_f1_model_config, open('model.pkl', 'wb'))"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "max_f1_model_config = dill.load(open('model.pkl', 'rb'))"
      ],
      "metadata": {
        "id": "MgMouePecnzU"
      },
      "execution_count": 10,
      "outputs": []
    },
    {
      "cell_type": "code",
      "execution_count": 36,
      "metadata": {
        "id": "de_uK8G2lAoq",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "8596cb32-8757-4747-da67-de54161d72e7"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.11/dist-packages/keras/src/layers/core/dense.py:87: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
            "  super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[1m100/100\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3ms/step\n"
          ]
        }
      ],
      "source": [
        "hid_act = 'leaky_relu'\n",
        "loss = 'sparse_categorical_crossentropy'\n",
        "initializer = LecunNormal()\n",
        "early_stopping = EarlyStopping(monitor='loss',\n",
        "                               patience=80,\n",
        "                               restore_best_weights=True)\n",
        "lr_schedule = tf.keras.callbacks.ReduceLROnPlateau(monitor='loss',\n",
        "                                                   factor=0.5,\n",
        "                                                   patience=10,# 20\n",
        "                                                   min_lr=1e-6,\n",
        "                                                   cooldown=10)\n",
        "\n",
        "nhid1, nhid2, num_layers, learning_rate, dropout_rate, batch_size = max_f1_model_config\n",
        "\n",
        "best_model = Sequential()\n",
        "best_model.add(Dense(nhid1, input_shape=(13,), activation=hid_act, kernel_initializer = initializer)) # If remove beat, shape =13\n",
        "for _ in range(num_layers - 1):\n",
        "    best_model.add(BatchNormalization())\n",
        "    best_model.add(Dense(nhid2, activation=hid_act, kernel_initializer = initializer))\n",
        "    best_model.add(BatchNormalization())\n",
        "    best_model.add(Dropout(dropout_rate))\n",
        "best_model.add(Dense(4, activation='softmax'))\n",
        "best_model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate), loss=loss)\n",
        "\n",
        "best_model.fit(X_scaled, y_train,\n",
        "               epochs=800,\n",
        "               batch_size = batch_size,\n",
        "               verbose=0,\n",
        "               callbacks= [early_stopping, lr_schedule])\n",
        "\n",
        "pred = best_model.predict(X_scaled_test)\n",
        "pred_labels = np.argmax(pred, axis=1)\n",
        "f_1 = f1_score(y_test, pred_labels, average='macro')"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(f_1)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "4qix1jYJt4Ne",
        "outputId": "f2b9937b-b0c8-4d7d-c118-dfc18edf769c"
      },
      "execution_count": 37,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "0.9227219224629701\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 38,
      "metadata": {
        "id": "piV1TMkOmaGU",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "ab9daa4c-950c-4063-a597-27c52f86331d"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "Classification Report:\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           0       0.87      0.85      0.86       668\n",
            "           1       0.90      0.88      0.89       692\n",
            "           2       0.99      0.99      0.99      1167\n",
            "           3       0.93      0.96      0.94       667\n",
            "\n",
            "    accuracy                           0.93      3194\n",
            "   macro avg       0.92      0.92      0.92      3194\n",
            "weighted avg       0.93      0.93      0.93      3194\n",
            "\n"
          ]
        }
      ],
      "source": [
        "print(\"\\nClassification Report:\")\n",
        "print(classification_report(y_test, pred_labels))"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "best_model.save('best_model.keras')"
      ],
      "metadata": {
        "id": "w7MrjBoYlvGa"
      },
      "execution_count": 43,
      "outputs": []
    },
    {
      "cell_type": "code",
      "execution_count": 39,
      "metadata": {
        "id": "bXnsgiz7npo7",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 551
        },
        "outputId": "13a00291-ef45-445c-8036-c2b933792365"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "Confusion Matrix:\n",
            "[[ 570   58    7   33]\n",
            " [  66  612    4   10]\n",
            " [   3    0 1158    6]\n",
            " [  15    7    4  641]]\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<Axes: >"
            ]
          },
          "metadata": {},
          "execution_count": 39
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ],
      "source": [
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns\n",
        "\n",
        "conf_matrix = confusion_matrix(y_test, pred_labels)\n",
        "print(\"\\nConfusion Matrix:\")\n",
        "print(conf_matrix)\n",
        "\n",
        "# Plot Confusion Matrix using Seaborn\n",
        "sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=[\"Class 0\", \"Class 1\", \"Class 2\", \"Class 3\"], yticklabels=[\"Class 0\", \"Class 1\", \"Class 2\", \"Class 3\"])"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.preprocessing import LabelBinarizer\n",
        "\n",
        "auc_score = roc_auc_score(y_test, pred, average='macro', multi_class='ovr')\n",
        "\n",
        "print(f\"AUC (Macro Average): {auc_score}\")\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "pC3co1KGpwTY",
        "outputId": "0b7b57c9-e2ae-4148-f4e4-c1e5e7bc3392"
      },
      "execution_count": 40,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "AUC (Macro Average): 0.9886003329629056\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "for i in range(4):  # Loop over each class\n",
        "    auc_class = roc_auc_score(y_test == i, pred[:, i])\n",
        "    print(f\"AUC for class {i}: {auc_class}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "MhuniXmUqSw1",
        "outputId": "5d6e652a-204f-4053-830d-d728c31e2762"
      },
      "execution_count": 41,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "AUC for class 0: 0.9773742301620038\n",
            "AUC for class 1: 0.984945569555916\n",
            "AUC for class 2: 0.9982244836100814\n",
            "AUC for class 3: 0.9938570485236211\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def explain_prediction(best_model, sample, feature_names, num_samples=300):\n",
        "    \"\"\"\n",
        "    given the sample we want to explain, we generate a background matrix\n",
        "    by repeating it num_samples times\n",
        "    \"\"\"\n",
        "    background = np.tile(sample, (num_samples, 1))\n",
        "    mask = np.random.randint(0, 2, size=background.shape).astype(bool) # a matrix of bool values with dim = background\n",
        "    random_samples = np.random.normal(0, 1, size=background.shape) # a matrix of random samples with dim = background\n",
        "    background[mask] = random_samples[mask] # replace the values in background with the random ones at the positions where mask has True\n",
        "\n",
        "    pred = best_model.predict(background)\n",
        "    predictions = np.argmax(pred, axis = 1) # after perturbing the background, take the predictions\n",
        "\n",
        "    importances = []\n",
        "    '''\n",
        "    importance of a feature is the difference between the mean of the\n",
        "    predictions when the feature is original and the mean of the predictions\n",
        "    when the feature is masked\n",
        "    '''\n",
        "    for i in range(len(sample)):\n",
        "        importance = np.mean(predictions[~mask[:, i]]) - np.mean(predictions[mask[:, i]])\n",
        "        importances.append(importance)\n",
        "    '''\n",
        "    positive importance --> masking leads to more 0 predictions\n",
        "    negative importance --> masking leads to more 1 predictions\n",
        "    '''\n",
        "    return pd.Series(importances, index=feature_names)\n",
        "\n",
        "def create_feature_matrix(importances):\n",
        "    influence_matrix = pd.DataFrame(index=importances.index, columns=['Influence'])\n",
        "    influence_matrix['Influence'] = importances\n",
        "    return influence_matrix # create a matrix with a single column, containing the importances\n",
        "\n",
        "def plot_feature_matrix(influence_matrix):\n",
        "    fig, ax = plt.subplots(1, 1, figsize=(10, 6))\n",
        "    sns.heatmap(influence_matrix, annot=True, cmap='coolwarm', center=0, vmin=-0.5, vmax=0.5)\n",
        "    plt.title('Feature Influence Matrix')\n",
        "    plt.tight_layout()\n",
        "    plt.show() # visualize the matrix using a Seaborn heatmap\n",
        "\n",
        "sample_to_explain = X_scaled.iloc[0] # choose a sample to explain (we try the first one)\n",
        "feature_names = [f'feature_{i+1}' for i in range(sample_to_explain.shape[0])]\n",
        "\n",
        "importances = explain_prediction(best_model, sample_to_explain, feature_names)\n",
        "\n",
        "influence_matrix = create_feature_matrix(importances)\n",
        "plot_feature_matrix(influence_matrix)\n",
        "'''\n",
        "warm color --> masking leads to more 0 predictions (feature useful for positive prediction)\n",
        "cool color --> masking leads to more 1 predictions (feature useful for negative prediction)\n",
        "gray --> no great difference between unmasked and masked prediction\n",
        "'''\n",
        "print(\"Feature Influence matrix:\")\n",
        "print(influence_matrix)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 885
        },
        "id": "zs2FHYBCNYxC",
        "outputId": "a12af7b6-2e91-4518-f45b-0069b45d3706"
      },
      "execution_count": 42,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3ms/step \n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x600 with 2 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA54AAAJOCAYAAADfxth8AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAo4RJREFUeJzs3XlcVPX+x/HXgIDIvimLFqDgUqG4pJCGlZamdW0RM00xc716S6VbWikuSWZU3NLUTNxKU8ul/ImlSYt6u2ZSluZulLnLIoIDzczvD2tqFHVEBlzez8fjPOp8z3c7Rx/Rl893MVgsFgsiIiIiIiIiDuJU1R0QERERERGRa5sGniIiIiIiIuJQGniKiIiIiIiIQ2ngKSIiIiIiIg6lgaeIiIiIiIg4lAaeIiIiIiIi4lAaeIqIiIiIiIhDaeApIiIiIiIiDqWBp4iIiIiIiDiUBp4iInLVKiws5IknniA4OBiDwcBTTz3F/v37MRgMzJ49u6q7d91r27Ytbdu2repuiIjIFUADTxGRSjR79mwMBkOZ17PPPuuQNjds2EBKSgp5eXkOqf9y/Pk9vvnmm3KVnzhxIrNnz2bQoEHMmzePxx57rIJ7eHVISkrCYDDg7e1NcXHxOc937dpl/Xv2yiuvXHL9v/32GykpKWRnZ1dAb0VE5HpUrao7ICJyPRo3bhwRERE2aTfffLND2tqwYQNjx44lKSkJX19fh7RRVT777DNatWrFmDFjrGn79++vug5VoWrVqlFUVMRHH31EYmKizbN3332X6tWrc/r06XLV/dtvvzF27FjCw8Np0qSJ3eU++eSTcrUnIiLXHg08RUSqQMeOHWnevHlVd+OynDp1Cg8Pjyrtw5EjR2jUqFGV9uFK4ebmxm233caCBQvOGXi+9957dOrUiQ8++KBS+lJUVESNGjVwdXWtlPZEROTKp6m2IiJXoFWrVtGmTRs8PDzw8vKiU6dO/PjjjzZ5vv/+e5KSkoiMjKR69eoEBwfz+OOPc/z4cWuelJQUnn76aQAiIiKs0y33799/wbWQBoOBlJQUm3oMBgPbtm3j0Ucfxc/Pj9atW1ufz58/n2bNmuHu7o6/vz+PPPIIv/zyS7nePSkpCU9PTw4cOECXLl3w9PQkKCiI5ORkTCYTAFlZWRgMBvbt28fKlStt3qss51trmJSURHh4uE2a2Wzm9ddf56abbqJ69erUqlWLAQMGkJuba5MvPDyczp0789VXX3HrrbdSvXp1IiMjmTt37jnt5OXlMWzYMMLDw3Fzc6N27dr06tWLY8eOWfMYjUbGjBlDvXr1cHNzo06dOvz73//GaDTa/e0effRRVq1aZTOtetOmTezatYtHH330nPwnTpwgOTmZW265BU9PT7y9venYsSPfffedNU9WVhYtWrQAoE+fPtZv/effm7Zt23LzzTezefNmbr/9dmrUqMGoUaOsz/7+3Xv37k316tXZvn27TT/uuece/Pz8+O233+x+VxERubpo4CkiUgXy8/M5duyYzfWnefPm0alTJzw9PZk0aRIvvPAC27Zto3Xr1jYDq08//ZS9e/fSp08f3njjDR555BEWLlzIvffei8ViAeDBBx+ke/fuALz22mvMmzePefPmERQUVK5+d+3alaKiIiZOnEi/fv0AePHFF+nVqxdRUVG8+uqrPPXUU6xdu5bbb7+93OtKTSYT99xzDwEBAbzyyiskJCSQlpbGjBkzAGjYsCHz5s0jMDCQJk2aXPZ7/d2AAQN4+umnue2220hPT6dPnz68++673HPPPZSWltrk3b17Nw8//DDt27cnLS0NPz8/kpKSbH5JUFhYSJs2bXjjjTe4++67SU9PZ+DAgfz000/8+uuvwJnB7v33388rr7zCfffdxxtvvEGXLl147bXX6Natm919f/DBBzEYDHz44YfWtPfee48GDRrQtGnTc/Lv3buXZcuW0blzZ1599VWefvpptm7dSkJCgnUQ2LBhQ8aNGwdA//79rd/69ttvt9Zz/PhxOnbsSJMmTXj99de54447yuxfeno6QUFB9O7d2/pLhOnTp/PJJ5/wxhtvEBoaave7iojIVcYiIiKVJiMjwwKUeVksFsvJkyctvr6+ln79+tmUO3TokMXHx8cmvaio6Jz6FyxYYAEsX3zxhTVt8uTJFsCyb98+m7z79u2zAJaMjIxz6gEsY8aMsd6PGTPGAli6d+9uk2///v0WZ2dny4svvmiTvnXrVku1atXOST/f99i0aZM1rXfv3hbAMm7cOJu8sbGxlmbNmtmk3XjjjZZOnTpd9L0SEhIsCQkJ57Tfu3dvy4033mi9//LLLy2A5d1337XJl5mZeU76jTfeeM63PnLkiMXNzc0yYsQIa9ro0aMtgOXDDz88p32z2WyxWCyWefPmWZycnCxffvmlzfNp06ZZAMv69evPKXv2e3h4eFgsFovl4Ycfttx1110Wi8ViMZlMluDgYMvYsWOt32Xy5MnWcqdPn7aYTCabuvbt22dxc3Oz+f6bNm0679+VhIQEC2CZNm1amc/O/u6rV6+2AJYJEyZY9u7da/H09LR06dLlgu8nIiJXP63xFBGpAlOmTCE6Ovqc9E8//ZS8vDy6d+9uEwV1dnamZcuWrFu3zprm7u5u/ffTp09TWFhIq1atAPj2229p06ZNhfd74MCBNvcffvghZrOZxMREm/4GBwcTFRXFunXrrNMuL7etNm3aMG/evHLVZa/Fixfj4+ND+/btbd6nWbNmeHp6sm7dOpspq40aNbL5zkFBQdSvX5+9e/da0z744AMaN27MAw88cE57BoPB2m7Dhg1p0KCBTbt33nknAOvWrSM+Pt6ud3j00Ufp2rUrhw4d4ocffuDQoUNlTrOFM+tC/2QymcjLy8PT05P69evz7bff2tXen/X06dPHrrx33303AwYMYNy4cSxZsoTq1aszffp0u9sSEZGrkwaeIiJV4NZbby1zc6Fdu3YBfw04zubt7W399xMnTjB27FgWLlzIkSNHbPLl5+dXYG//cvZOvLt27cJisRAVFVVmfhcXl3K1U7169XOmzfr5+Z2zzrKi7dq1i/z8fGrWrFnm87O/8w033HBOnrP7uWfPHh566KGLtrt9+/bzThU+u90Luffee/Hy8uL9998nOzubFi1aUK9evTLXv5rNZtLT05k6dSr79u2zTn8FCAgIsLvNsLCwS9pI6JVXXmH58uVkZ2fz3nvvnfd7i4jItUMDTxGRK4jZbAbOrPMMDg4+53m1an/9ZzsxMZENGzbw9NNP06RJEzw9PTGbzXTo0MFaz4X8GW07298HH2f7e5T1z/4aDAZWrVqFs7PzOfk9PT0v2o+ylFXX5TAYDNZ1r3939ruazWZq1qzJu+++W2Y9Zw8Mz9fPstq6ELPZzC233MKrr75a5vM6derYXZebmxsPPvggc+bMYe/evTabRJ1t4sSJvPDCCzz++OOMHz8ef39/nJyceOqpp+z6O/Sns/9eXMyWLVusg+mtW7da1yGLiMi1SwNPEZErSN26dQGoWbMm7dq1O2++3Nxc1q5dy9ixYxk9erQ1/c+I6d+db4Dp5+cHcM4GQD///PMl9ddisRAREVHm1OErhZ+fn8301z+d/a5169ZlzZo13HbbbZc8mDqfunXr8sMPP1w0z3fffcddd9113j+vS/Hoo48ya9YsnJyceOSRR86bb8mSJdxxxx288847Nul5eXkEBgZa7yuiT386deoUffr0oVGjRsTHx/Pyyy/zwAMPWHfOFRGRa5N2tRURuYLcc889eHt7M3HixHN2UAU4evQo8Fek7ezI2uuvv35OmT/P2jx7gOnt7U1gYCBffPGFTfrUqVPt7u+DDz6Is7MzY8eOPacvFovF5miXqlS3bl1++ukn6/cD+O6771i/fr1NvsTEREwmE+PHjz+njt9//71cu/Q+9NBDfPfddyxduvScZ39+s8TERA4cOMDbb799Tp7i4mJOnTp1SW3ecccdjB8/njfffLPMyPmfnJ2dz/lzW7x4MQcOHLBJO9/fofJ45plnyMnJYc6cObz66quEh4fTu3fvSzo2RkRErj6KeIqIXEG8vb156623eOyxx2jatCmPPPIIQUFB5OTksHLlSm677TbefPNNvL29uf3223n55ZcpLS0lLCyMTz75hH379p1TZ7NmzQB47rnneOSRR3BxceG+++7Dw8ODJ554gpdeeoknnniC5s2b88UXX7Bz5067+1u3bl0mTJjAyJEj2b9/P126dMHLy4t9+/axdOlS+vfvT3JycoV9n/J6/PHHefXVV7nnnnvo27cvR44cYdq0adx0000UFBRY8yUkJDBgwABSU1PJzs7m7rvvxsXFhV27drF48WLS09N5+OGHL6ntp59+miVLltC1a1cef/xxmjVrxokTJ1ixYgXTpk2jcePGPPbYYyxatIiBAweybt06brvtNkwmEz/99BOLFi1i9erVZa4JPh8nJyeef/75i+br3Lkz48aNo0+fPsTHx7N161beffddIiMjbfLVrVsXX19fpk2bhpeXFx4eHrRs2fKcNb8X89lnnzF16lTGjBljPd4lIyODtm3b8sILL/Dyyy9fUn0iInL10MBTROQK8+ijjxIaGspLL73E5MmTMRqNhIWF0aZNG5udQ9977z2GDh3KlClTsFgs3H333axateqcsxBbtGjB+PHjmTZtGpmZmZjNZvbt24eHhwejR4/m6NGjLFmyhEWLFtGxY0dWrVp1SZu9PPvss0RHR/Paa68xduxY4MyaxLvvvpv777+/Yj7KZWrYsCFz585l9OjRDB8+nEaNGjFv3jzee+89srKybPJOmzaNZs2aMX36dEaNGkW1atUIDw+nZ8+e3HbbbZfctqenJ19++SVjxoxh6dKlzJkzh5o1a3LXXXdRu3Zt4MxAcdmyZbz22mvMnTuXpUuXUqNGDSIjI3nyyScdNo151KhRnDp1ivfee4/333+fpk2bsnLlSp599lmbfC4uLsyZM4eRI0cycOBAfv/9dzIyMi5p4Hny5Ekef/xxYmNjee6556zpbdq04cknnyQtLY0HH3zQujOziIhcWwyWS90BQUREREREROQSaI2niIiIiIiIOJQGniIiIiIiIuJQGniKiIiIiIiIQ2ngKSIiIiIiIg6lgaeIiIiIiIg4lAaeIiIiIiIi4lAaeIqIiIiIiIhDVavqDlzPvt15vKq7ICIiIiJSZZpGB1R1Fy7JSpf6ldJOp9IdldJOZVLEU0RERERERBxKEU8RERERERE7GFwMVd2Fq5YiniIiIiIiIuJQiniKiIiIiIjYwamaIp7lpYiniIiIiIiIOJQiniIiIiIiInYwuChuV176ciIiIiIiIuJQGniKiIiIiIiIQ2mqrYiIiIiIiB20uVD5KeIpIiIiIiIiDqWIp4iIiIiIiB0MLop4lpciniIiIiIiIuJQiniKiIiIiIjYQWs8y6/CB54Wi4UBAwawZMkScnNz2bJlC02aNKnoZkRE5DpnsVhY8u5MPvtkBadOnaR+wxgeH/w0IaF1Lljuk5Uf8NGH75Kfe4IbIuqRNGA49aIbWZ+PG/lPtv+wxabMXR268MQ//22T9vmalaxcvpBDB37BvUYNWt52J48PSq64FxQREbmGVPjAMzMzk9mzZ5OVlUVkZCSBgYGXXWdSUhJ5eXksW7bs8jt4mU6fPs3AgQPZvHkz27dvp3PnzldEv0RErjcffTCfzI8XM+ip5wmqFcrid2fw0uhhTJ76Lq6ubmWW2fjlGubN/A99//k09aJvYtWK93lp9DDSpi3Ax9ffmu/Oe+6na49+1ntXt+o29axctoCVSxfQo88Q6tVvxOnTpzl65KBjXlRERK4YWuNZfhW+xnPPnj2EhIQQHx9PcHAw1apdObN5TSYTZrP5sutwd3fnX//6F+3ataugnomIyKWwWCysWrGIBxKTaN7qdm6MqMfgYaPJPXGMb/77xXnLrVy2kDvvuZ+27TpT+4YI+g7+N65ubmR9+rFNPle36vj6BVivGjU8rM8KCwtYNG8Gg4eP5ra2d1MrpDY3RtSjecs2DntfERGRq12FDjyTkpIYOnQoOTk5GAwGwsPDMZvNpKamEhERgbu7O40bN2bJkiXWMiaTib59+1qf169fn/T0dOvzlJQU5syZw/LlyzEYDBgMBrKyssjKysJgMJCXl2fNm52djcFgYP/+/QDMnj0bX19fVqxYQaNGjXBzcyMnJwej0UhycjJhYWF4eHjQsmVLsrKy7HpHDw8P3nrrLfr160dwcHBFfDYREblERw7/Rl7ucW5u0tyaVsPDk7rRjdj10w9llvm9tJR9u3dwc+O/yjg5OXFzkxbs2mFbZn3WJ/R7tCNP/7MHC+a8hfH0aeuzrVs2YbFYOHH8KCMGdeefSf/g9Zee5/jRwxX8liIicqVxqmaolOtaVKHhyPT0dOrWrcuMGTPYtGkTzs7OpKamMn/+fKZNm0ZUVBRffPEFPXv2JCgoiISEBMxmM7Vr12bx4sUEBASwYcMG+vfvT0hICImJiSQnJ7N9+3YKCgrIyMgAwN/fnw0bNtjVp6KiIiZNmsTMmTMJCAigZs2aDBkyhG3btrFw4UJCQ0NZunQpHTp0YOvWrURFRVXkJxEREQfIzz0BYDM99s/7vD+ena2gIA+z2YSP37llfvv1Z+v9bQntCawZjJ9/EDn7d7Ng9lQOHshh+KhUAI4cOoDZYmb5ojn06v8UNWp4smj+DCa+8CST3phHNReXinxVERGRa0KFDjx9fHzw8vLC2dmZ4OBgjEYjEydOZM2aNcTFxQEQGRnJV199xfTp00lISMDFxYWxY8da64iIiGDjxo0sWrSIxMREPD09cXd3x2g0livCWFpaytSpU2ncuDEAOTk5ZGRkkJOTQ2hoKADJyclkZmaSkZHBxIkTK+BLnMtoNGI0Gm3SSkqM512HJCIif/kqazUzp7xsvf/36Fcc1tZdHbpY//2G8Lr4+gXw4vP/4vDBX6kVUhuLxYLp99/p3X8YMU1bAjD06bEM7HUfP27dTOOmrRzWNxERqVoG52szGlkZHLoAc/fu3RQVFdG+fXub9JKSEmJjY633U6ZMYdasWeTk5FBcXExJSUmF7YTr6upKTEyM9X7r1q2YTCaio6Nt8hmNRgICAiqkzbKkpqbaDLAB+g95mgFDn3FYmyIi14pmt7amXvRN1vvS0hIA8vNO4Of/1yZ2+XknCI8se+aKt7cvTk7O1mjp38v4nhUF/bt69c+0e+iPgaev/5mfFWE3RPxVt48fXt4+HNN0WxERkTI5dOBZWFgIwMqVKwkLC7N55uZ2JtK3cOFCkpOTSUtLIy4uDi8vLyZPnszXX399wbqdnM4sT7VYLNa00tLSc/K5u7tjMPz1m4nCwkKcnZ3ZvHkzzs7ONnk9PT0v4e0uzciRIxk+fLhN2racQoe1JyJyLXGv4YH73zb4sVgs+PoF8MN33xAeeeYXiUVFp9izcxvt732gzDqqubgQUa8+P3y/mRZxCQCYzWZ+/O4b7u700Hnb/nnvLgB8/c4McOs3PPPLzIMHcggIrAlA4ckCThbkExSktf8iItcyJ0U8y82hA8+/b+iTkJBQZp7169cTHx/P4MGDrWl79uyxyePq6orJZLJJCwoKAuDgwYP4+fkBZzYXupjY2FhMJhNHjhyhTZvK24HQzc3NOtj+k6vruQNlERG5OIPBQMf7E1n2/hyCQ+tQs1Yoi+fPwM8/kOatbrfmm/DcUFrEJXBP54cB6NTlEd56bQKR9RpQL7oRq5a/j/H0aRLadQbg8MFfWf/5pzRpHoeXlw8/79/NvJnpNLipCTdG1AMgJOwGmrdsw5wZr9FvyLO416jBwjnTCA27kUYxzSr/Y4iIiFwFHDrw9PLyIjk5mWHDhmE2m2ndujX5+fmsX78eb29vevfuTVRUFHPnzmX16tVEREQwb948Nm3aRETEX1OYwsPDWb16NTt27CAgIAAfHx/q1atHnTp1SElJ4cUXX2Tnzp2kpaVdtE/R0dH06NGDXr16kZaWRmxsLEePHmXt2rXExMTQqVOni9axbds2SkpKOHHiBCdPnrQOeCtqerCIiFzcfQ/1xHj6NDPfnETRqULqN4rh2bGv2qydP3zoACcL8qz3cW3aUZCfx5J33yYv9wQ3Rkbx7NhXrVNtq1VzYWv2JlatODMgDQisya3xd/BAtySbtgcNH828mem8PDYZg5OBhjfHMnLsq1fUEWIiIlLxDE6KeJaXwfL3uaoV4PXXX+f111+3HmlisVj4z3/+w1tvvcXevXvx9fWladOmjBo1ittvvx2j0cjAgQNZunQpBoOB7t274+Pjw6pVq6wDuqNHj9KjRw82btxIYWEh69ato23btqxfv55Bgwaxa9cuWrRowb/+9S+6du3Kvn37CA8PZ/bs2Tz11FM2R67AmSm5EyZMYO7cuRw4cIDAwEBatWrF2LFjueWWWy76juHh4fz888/npF/qp/x25/FLyi8iIiIici1pGu24PVYcYX1s5cxsuW3L5kpppzJV+MBT7KeBp4iIiIhcz662geeG5i0qpZ34bzZVSjuVyamqOyAiIiIiIiLXNg08z9KxY0c8PT3LvBx1xqeIiIiIiFz5nJwNlXJdi7QLwllmzpxJcXFxmc/8/c9/zpuIiIiIiIiUTQPPs5x93qiIiIiIiAhoV9vLoam2IiIiIiIi4lCKeIqIiIiIiNjhWl1/WRkU8RQRERERERGHUsRTRERERETEDgZFPMtNEU8RERERERFxKEU8RURERERE7GBwUtyuvPTlRERERERExKEU8RQREREREbGDzvEsP0U8RURERERExKEU8RQREREREbGDzvEsP0U8RURERERExKEU8axCJ057VnUXRERERETETlrjWX6KeIqIiIiIiIhDKeIpIiIiIiJiB53jWX76ciIiIiIiIuJQiniKiIiIiIjYQWs8y08RTxEREREREXEoRTxFRERERETsoHM8y08RTxERERERkavclClTCA8Pp3r16rRs2ZL//e9/dpVbuHAhBoOBLl26OLR/GniKiIiIiIjYweBkqJTrUr3//vsMHz6cMWPG8O2339K4cWPuuecejhw5csFy+/fvJzk5mTZt2pT3k9hNA08REREREZGr2Kuvvkq/fv3o06cPjRo1Ytq0adSoUYNZs2adt4zJZKJHjx6MHTuWyMhIh/dRA08RERERERE7GJycKuW6FCUlJWzevJl27dpZ05ycnGjXrh0bN248b7lx48ZRs2ZN+vbtW+7vcSm0uZCIiIiIiMgVxGg0YjQabdLc3Nxwc3M7J++xY8cwmUzUqlXLJr1WrVr89NNPZdb/1Vdf8c4775CdnV1hfb4YRTxFRERERESuIKmpqfj4+NhcqampFVL3yZMneeyxx3j77bcJDAyskDrtUeERT4vFwoABA1iyZAm5ubls2bKFJk2aVHQzIiIiIiIilao8G/+Ux8iRIxk+fLhNWlnRToDAwECcnZ05fPiwTfrhw4cJDg4+J/+ePXvYv38/9913nzXNbDYDUK1aNXbs2EHdunUv9xXOUeEDz8zMTGbPnk1WVhaRkZEVMopOSkoiLy+PZcuWXX4HL1NWVhavvfYa//vf/ygoKCAqKoqnn36aHj16VHXXRESuexaLhZXvT2X92g8oPnWSyAZNeKTf89QMufG8ZXZt+4Y1K2bzy97t5Ocepf/Tr9P41jtt8mR/vYYvP1nML3u3caown2dfXkSdiAaOfh0REblOnW9abVlcXV1p1qwZa9eutR6JYjabWbt2LUOGDDknf4MGDdi6datN2vPPP8/JkydJT0+nTp06l93/slT4VNs9e/YQEhJCfHw8wcHBVKt25SwjNZlM1tF8eW3YsIGYmBg++OADvv/+e/r06UOvXr34+OOPK6iXIiJSXp8uzyBr1Xs80v8Fnk59F1c3d96cMJDSEuN5y5QYi6l9Y30S+446bx7j6WLqNojlHz2fckCvRUTkanGlHqcyfPhw3n77bebMmcP27dsZNGgQp06dok+fPgD06tWLkSNHAlC9enVuvvlmm8vX1xcvLy9uvvlmXF1dK/Sb/alCB55JSUkMHTqUnJwcDAYD4eHhmM1mUlNTiYiIwN3dncaNG7NkyRJrGZPJRN++fa3P69evT3p6uvV5SkoKc+bMYfny5RgMBgwGA1lZWWRlZWEwGMjLy7Pmzc7OxmAwsH//fgBmz56Nr68vK1asoFGjRri5uZGTk4PRaCQ5OZmwsDA8PDxo2bIlWVlZdr3jqFGjGD9+PPHx8dStW5cnn3ySDh068OGHH1bEJxQRkXKyWCysWzmfDg/1o3GLOwi7MZreQ14kP/co32367Lzlboptw33dh9Kk5V3nzdMy4T7u7TqQBre0ckTXRURELku3bt145ZVXGD16NE2aNCE7O5vMzEzrhkM5OTkcPHiwSvtYoeHI9PR06taty4wZM9i0aRPOzs6kpqYyf/58pk2bRlRUFF988QU9e/YkKCiIhIQEzGYztWvXZvHixQQEBLBhwwb69+9PSEgIiYmJJCcns337dgoKCsjIyADA39+fDRs22NWnoqIiJk2axMyZMwkICKBmzZoMGTKEbdu2sXDhQkJDQ1m6dCkdOnRg69atREVFXfJ75+fn07Bhw0suJyIiFef4kQMU5B2j/t8Gh+4eXoTXu4V9O76j+W0dq7B3IiJyLaisNZ7lMWTIkDKn1gIXDbLNnj274jt0lgodePr4+ODl5YWzszPBwcEYjUYmTpzImjVriIuLAyAyMpKvvvqK6dOnk5CQgIuLC2PHjrXWERERwcaNG1m0aBGJiYl4enri7u6O0Wgsc3HsxZSWljJ16lQaN24MnBntZ2RkkJOTQ2hoKADJyclkZmaSkZHBxIkTL6n+RYsWsWnTJqZPn37JfRMRkYpTkHcMAG/fAJt0L98ACvKOV0WXRERE5A8OXYC5e/duioqKaN++vU16SUkJsbGx1vspU6Ywa9YscnJyKC4upqSkpMJ2wnV1dSUmJsZ6v3XrVkwmE9HR0Tb5jEYjAQEBZxe/oHXr1tGnTx/efvttbrrppgvmLessnpIScHW1b9GwiIjY+t+XK1kwfZz1fvDIKVXYGxERuR4YnHQaZXk5dOBZWFgIwMqVKwkLC7N59ucuTQsXLiQ5OZm0tDTi4uLw8vJi8uTJfP311xes2+mPP3SLxWJNKy0tPSefu7s7BsNfIfHCwkKcnZ3ZvHkzzs7ONnk9PT3tfrfPP/+c++67j9dee41evXpdNH9qaqpNZBfgsYHP0WvQC3a3KSIif4lp3pbwerdY73//vQSAgrzj+PgFWdNP5h2ndnj9Su+fiIiI/MWhA8+/b+iTkJBQZp7169cTHx/P4MGDrWl79uyxyePq6orJZLJJCwo68z8VBw8exM/PDzizudDFxMbGYjKZOHLkCG3atLmU17HKysqic+fOTJo0if79+9tVpqyzeL7aWa7mRUQEqO7uQXV3D+u9xWLB2zeQHT98bT3qpLiokP27t9LmnsSq6qaIiFxDnJyv3DWeVzqHDjy9vLxITk5m2LBhmM1mWrduTX5+PuvXr8fb25vevXsTFRXF3LlzWb16NREREcybN49NmzYRERFhrSc8PJzVq1ezY8cOAgIC8PHxoV69etSpU4eUlBRefPFFdu7cSVpa2kX7FB0dTY8ePejVqxdpaWnExsZy9OhR1q5dS0xMDJ06dbpg+XXr1tG5c2eefPJJHnroIQ4dOgScGRz7+/uft1xZZ/G4up5/e38REbk0BoOBOzr1JPODGdQMvoGAmmF8/P4UfPyCaNzir3M508c+QeNb76Jtx+4AnC4u4uihHOvz40cO8Mu+n/Dw9ME/KASAUyfzOXHsIPm5RwE48tt+ALx9A/Hxu/zzqkVERK51Dj9kc/z48QQFBZGamsrevXvx9fWladOmjBp15ry0AQMGsGXLFrp164bBYKB79+4MHjyYVatWWevo168fWVlZNG/enMLCQtatW0fbtm1ZsGABgwYNIiYmhhYtWjBhwgS6du160T5lZGQwYcIERowYwYEDBwgMDKRVq1Z07tz5omXnzJlDUVERqamppKamWtMTEhLsPpJFREQco/0/+lByupj3po+juOgkdRvE8s/n3sLlb+vpjx3+lVMnc633OXt/JD2lr/X+gzmTAWiZcD+9hkwA4Ptvspg/9a+lEbNe/zcA93YdSKfEv2bsiIjIte1K3tX2Smew/H2RpFSqNd8r4ikiIiIi1692MVfXRpt7ky4eqKoIkbM/rpR2KpPDI54iIiIiIiLXAu1qW376cmfp2LEjnp6eZV6XesaniIiIiIiIKOJ5jpkzZ1JcXFzmswttHiQiIiIiItc2rfEsPw08z3L2eaMiIiIiIiJyeTTwFBERERERsYMinuWnNZ4iIiIiIiLiUIp4ioiIiIiI2EG72pafvpyIiIiIiIg4lCKeIiIiIiIidtAaz/JTxFNEREREREQcShFPERERERERO2iNZ/npy4mIiIiIiIhDKeIpIiIiIiJiD4PWeJaXIp4iIiIiIiLiUIp4ioiIiIiI2EG72pafBp5VKMzjWFV3QURERESkCoVVdQekkmjgKSIiIiIiYgftalt++nIiIiIiIiLiUIp4ioiIiIiI2EFrPMtPEU8RERERERFxKEU8RURERERE7KA1nuWnLyciIiIiIiIOpYiniIiIiIiIHbTGs/wU8RQRERERERGHUsRTRERERETEDop4lp8iniIiIiIiIuJQiniKiIiIiIjYQ7valpu+nIiIiIiIiDhUhQ88LRYL/fv3x9/fH4PBQHZ2dkU3ISIiIiIiUukMBkOlXNeiCp9qm5mZyezZs8nKyiIyMpLAwMDLrjMpKYm8vDyWLVt2+R28TDt27GDgwIFs27aN/Px8QkNDefTRRxkzZgwuLi5V3T0RkeuGxWJhwfzZfJq5klOnCmnQ6GYG/vMpQsNqX7Dc/320jKUfvE9e7gnCI+rSb9BQous3BODkyQIWzJ9N9rffcOzoEbx9fGkZdxuPPtYHDw9Pm3rWfprJiqVL+O3AL9So4UF86wQG/PNJh72viIjI1azCB5579uwhJCSE+Pj4iq76splMJgwGA06XMTfbxcWFXr160bRpU3x9ffnuu+/o168fZrOZiRMnVmBvRUTkQpYuWcjHKz7kyeHPUis4mPfmZTD2hWd4Y1oGrq6uZZb56vN1zHr7LQYNeYroBg1ZsewDxr7wDFNmzMHX148Tx49z4vhxkp4YSJ0bbuTo4cNMe/N1Thw/zjPPpVjrWf7hYpYvXUTvxwcS3aABxtOnOXL4UCW9uYiIyNWnQqfaJiUlMXToUHJycjAYDISHh2M2m0lNTSUiIgJ3d3caN27MkiVLrGVMJhN9+/a1Pq9fvz7p6enW5ykpKcyZM4fly5dbQ89ZWVlkZWVhMBjIy8uz5s3OzsZgMLB//34AZs+eja+vLytWrKBRo0a4ubmRk5OD0WgkOTmZsLAwPDw8aNmyJVlZWXa9Y2RkJH369KFx48bceOON3H///fTo0YMvv/yyIj6hiIjYwWKx8NGyD0h8pCct424jPKIuT454lhPHj/H1xq/OW2750sXc3eFe7rq7I3VuCGfQkGG4ubmx9pNVANwYHsGzz4/l1pbxhISEEdOkKT16P86mrzdiMpkAKDx5knfnzeLJESNJuOMuQkLCCI+oy62tbquUdxcRkapjcHKqlOtaVKERz/T0dOrWrcuMGTPYtGkTzs7OpKamMn/+fKZNm0ZUVBRffPEFPXv2JCgoiISEBMxmM7Vr12bx4sUEBASwYcMG+vfvT0hICImJiSQnJ7N9+3YKCgrIyMgAwN/fnw0bNtjVp6KiIiZNmsTMmTMJCAigZs2aDBkyhG3btrFw4UJCQ0NZunQpHTp0YOvWrURFRV3SO+/evZvMzEwefPDBS/5eIiJSPocPHSQ39wQxTZpZ0zw8PImu35Ad27fRJuHOc8qUlpayZ/dOHkp81Jrm5ORE4ybN2PHTtvO2VXTqFDVq1MDZ2RmA7C2bsZjNnDh+jCEDkiguKqJ+w5vo028QQUE1K/AtRURErh0VOvD08fHBy8sLZ2dngoODMRqNTJw4kTVr1hAXFweciRh+9dVXTJ8+nYSEBFxcXBg7dqy1joiICDZu3MiiRYtITEzE09MTd3d3jEYjwcHBl9yn0tJSpk6dSuPGjQHIyckhIyODnJwcQkNDAUhOTiYzM5OMjAy7p8vGx8fz7bffYjQa6d+/P+PGjbvkvomISPnk5Z4AwNfPzybdx9eP3D+ene1kQT5ms7nMMr/+klNmmYL8fBYtmMfdHTtb0w4f+g2LxcKS99/liQFDqOHhwbtzZ5Hy3NO8PmWm1vuLiFzDDE7X5sY/lcGh53ju3r2boqIi2rdvb5NeUlJCbGys9X7KlCnMmjWLnJwciouLKSkpoUmTJhXSB1dXV2JiYqz3W7duxWQyER0dbZPPaDQSEBBgd73vv/8+J0+e5LvvvuPpp5/mlVde4d///vd58xuNRoxGo01aidGIq5ub3W2KiFyvPl+3hrfeeNV6//zYVIe3WVR0ivFjRlLnhnAe6dHbmm62WPj99995YuAQYpu2AGDEM8/Tp8fD/PB9NrHNWji8byIiIlcbhw48CwsLAVi5ciVhYWE2z9z+GHAtXLiQ5ORk0tLSiIuLw8vLi8mTJ/P1119fsO4/NwiyWCzWtNLS0nPyubu722xJXFhYiLOzM5s3b7ZOm/qTp6fn2cXPq06dOgA0atQIk8lE//79GTFixDl1/ik1NdUmsgsweOgwhjw5wu42RUSuV7e2jLfuPAtQWloCQF5uLv7+f/3SMD8vl4jIemXW4eXtg5OTE3m5uTbp+Xm5+Pn726QVFxUx9oVncK9Rg2dfGEe1an/9uPT3O5O3zg3h1jQfH1+8vH04evRw+V5QRESuDtfo+svK4NCB59839ElISCgzz/r164mPj2fw4MHWtD179tjkcXV1tW7q8KegoCAADh48iN8f06bsOTM0NjYWk8nEkSNHaNOmzaW8znmZzWZKS0sxm83nHXiOHDmS4cOH26Tt+/VYhbQvInKtc69RA/caNaz3FosFPz9/vv/uWyLrnhloFhWdYueO7XTodH+Zdbi4uFC3XjTff/ctreJbA2f++/199rfce18Xa76iolOMff4Zqrm48NzoCefskNug0c0AHPj1FwIDz/wsOnmygJMF+QTVrFVh7ywiInItcejA08vLi+TkZIYNG4bZbKZ169bk5+ezfv16vL296d27N1FRUcydO5fVq1cTERHBvHnz2LRpExEREdZ6wsPDWb16NTt27CAgIAAfHx/q1atHnTp1SElJ4cUXX2Tnzp2kpaVdtE/R0dH06NGDXr16kZaWRmxsLEePHmXt2rXExMTQqVOnC5Z/9913cXFx4ZZbbsHNzY1vvvmGkSNH0q1btwuu63Fzc7NGef/k6nbyov0VEZFzGQwG7uvyEIsXzic0NIyatUJ4b14G/gGBtIxrbc33wsgRtIpvTaf7HgDgHw90Jf3Vl6gXVZ+o6AZ8tPwDThtPc1f7DsCZQWfKc//GaDTy7NMjKSoqoqioCABvHx+cnZ0Jq12HW1vdxjvT32Tw0OG41/Bg3uy3Catdh1tiYs/trIiIXDO0xrP8HDrwBBg/fjxBQUGkpqayd+9efH19adq0KaNGjQJgwIABbNmyhW7dumEwGOjevTuDBw9m1apV1jr69etHVlYWzZs3p7CwkHXr1tG2bVsWLFjAoEGDiImJoUWLFkyYMIGuXbtetE8ZGRlMmDCBESNGcODAAQIDA2nVqhWdO3e+aNlq1aoxadIkdu7cicVi4cYbb2TIkCEMGzas/B9JREQu2QMPP8Lp06eZ+sarnCospOFNtzB63Es2EcpDB3+jID/fet864Q7yC/JYMC+D3NxcIiLrMmbcJHz/mD67Z/cudu7YDsCgvo/ZtDc94z1q1Tqzyd1Tyc/yzoypjE8ZhZPBiZtuiWH0+Ek2U3JFRETkLwbL3xdJSqXavudAVXdBRERERKTKNKwbdvFMV5DcFwdVSjt+z71VKe1UJq2OFREREREREYfSwPMsHTt2xNPTs8zL3jM+RURERETkGuRkqJzrGqTFKGeZOXMmxcXFZT7zP2u7fREREREREbk4DTzPcvZ5oyIiIiIiIgAGneNZbvpyIiIiIiIi4lCKeIqIiIiIiNhB53iWnyKeIiIiIiIi4lCKeIqIiIiIiNjDoLhdeenLiYiIiIiIiEMp4ikiIiIiImIHrfEsP0U8RURERERExKEU8RQREREREbGHzvEsN305ERERERERcShFPEVEREREROxgMGiNZ3kp4ikiIiIiIiIOpYhnFVrzU2hVd0FEREREpMo0rFvVPbhEWuNZbvpyIiIiIiIi4lCKeIqIiIiIiNhB53iWnyKeIiIiIiIi4lCKeIqIiIiIiNjDoLhdeenLiYiIiIiIiEMp4ikiIiIiImIPrfEsN0U8RURERERExKEU8RQREREREbGDQWs8y01fTkRERERERBxKEU8RERERERF7aI1nuSniKSIiIiIiIg6liKeIiIiIiIgdDE6K25VXhX85i8VC//798ff3x2AwkJ2dXdFNiIiIiIiIyFWkwiOemZmZzJ49m6ysLCIjIwkMDLzsOpOSksjLy2PZsmWX38EKtHv3bmJjY3F2diYvL6+quyMict2zWCz8L/MNfvzvYozFBYRENKXtw2PwDQo/b5lv1kxn79ZPyT2yl2ou1QkOjyW+8wj8akaWWf9Hb/cn56cvubfPm0Te0s6BbyMiIlccg9Z4lleFRzz37NlDSEgI8fHxBAcHU63alTOb12QyYTabK6Su0tJSunfvTps2bSqkPhERuXzffjaT776cR9uuKXR9ahEuru6smP4Ev5caz1vmtz2buOW2R3n4yff5x4BZmE2/s2L6E5Qai87J+90XczCg/+kQERG5VBU68ExKSmLo0KHk5ORgMBgIDw/HbDaTmppKREQE7u7uNG7cmCVLlljLmEwm+vbta31ev3590tPTrc9TUlKYM2cOy5cvx2AwYDAYyMrKIisrC4PBYBNpzM7OxmAwsH//fgBmz56Nr68vK1asoFGjRri5uZGTk4PRaCQ5OZmwsDA8PDxo2bIlWVlZl/Suzz//PA0aNCAxMfFyPpmIiFQQi8XCd1/MpXn7gUTefBeBofVp9+gkThUcYe8Pa85b7v4BM2l464MEBEcRGNaAdt1TOZn7G0d+/dEm39ED29mSlcGdj7zo6FcREZErlZNT5VzXoAoNR6anp1O3bl1mzJjBpk2bcHZ2JjU1lfnz5zNt2jSioqL44osv6NmzJ0FBQSQkJGA2m6lduzaLFy8mICCADRs20L9/f0JCQkhMTCQ5OZnt27dTUFBARkYGAP7+/mzYsMGuPhUVFTFp0iRmzpxJQEAANWvWZMiQIWzbto2FCxcSGhrK0qVL6dChA1u3biUqKuqidX722WcsXryY7OxsPvzww8v6ZiIiUjEKTvxK0cmj1ImOt6a5uXtR64YYDu3PJjq2k131GItPAlC9ho81rbSkmE/mJ5Pw0Gg8vIMqtuMiIiLXgQodePr4+ODl5YWzszPBwcEYjUYmTpzImjVriIuLAyAyMpKvvvqK6dOnk5CQgIuLC2PHjrXWERERwcaNG1m0aBGJiYl4enri7u6O0WgkODj4kvtUWlrK1KlTady4MQA5OTlkZGSQk5NDaGgoAMnJyWRmZpKRkcHEiRMvWN/x48dJSkpi/vz5eHt7X3J/RETEMYoKjgJQwyvAJr2GVyBFJ4/ZVYfFbObL5RMJiWhKQEi0Nf2rZamEhMcSefNdFddhERGR64hDF2Du3r2boqIi2rdvb5NeUlJCbGys9X7KlCnMmjWLnJwciouLKSkpoUmTJhXSB1dXV2JiYqz3W7duxWQyER0dbZPPaDQSEBBwdvFz9OvXj0cffZTbb7/9kvphNBoxGm3XGJWWuuLi4nZJ9YiIyBk7Nn9E1uIx1vvOT0y77Do//3AcJw7u4qGh71nT9v3wGb/u/ppuIzTDRUTkuqfNhcrNoQPPwsJCAFauXElYWJjNMze3MwOuhQsXkpycTFpaGnFxcXh5eTF58mS+/vrrC9bt9MfcZ4vFYk0rLS09J5+7uzuGv/0FKSwsxNnZmc2bN+Ps7GyT19PT86Lv9Nlnn7FixQpeeeUVa/tms5lq1aoxY8YMHn/88TLLpaam2kR2ATp0H829PVIu2qaIiJwr4qY7qHXDX79YNJlKACg6eRwP75rW9KKTxwgMa3jR+j7/YBz7t2Xx4D/n4+n71wybX3f9l/zjObz93K02+VfN/hchkc148J/zLvdVRERErnkOHXj+fUOfhISEMvOsX7+e+Ph4Bg8ebE3bs2ePTR5XV1dMJpNNWlDQmTU2Bw8exM/PD8CuM0NjY2MxmUwcOXKkXDvSbty40aYvy5cvZ9KkSWzYsOGcwfXfjRw5kuHDh9ukzfzM9ZLbFxGRM1yre+Ja/a9fGFosFmp4BfHrro0E/THQLDldyOGc77n5tu7nrcdisfDFh+PZu3UND/xzLt4BtW2eN72rH41aPWyTtmDy/bT+x7NE3HRnBb6RiIhc6QzX6MY/lcGhA08vLy+Sk5MZNmwYZrOZ1q1bk5+fz/r16/H29qZ3795ERUUxd+5cVq9eTUREBPPmzWPTpk1ERERY6wkPD2f16tXs2LGDgIAAfHx8qFevHnXq1CElJYUXX3yRnTt3kpaWdtE+RUdH06NHD3r16kVaWhqxsbEcPXqUtWvXEhMTQ6dOF958omFD29+af/PNNzg5OXHzzTdfsJybm5s1yvsnFxfLeXKLiMilMhgMNL69F998Og3fwHC8/MP4OvM/eHjXJPLmv87bXPZWEpE3tyOmTU/gTKRz57cf0+nxKbi4eXDqj7WibtW9qOZaHQ/voDI3FPLyCz1nkCoiIiJlc/ghm+PHjycoKIjU1FT27t2Lr68vTZs2ZdSoUQAMGDCALVu20K1bNwwGA927d2fw4MGsWrXKWke/fv3IysqiefPmFBYWsm7dOtq2bcuCBQsYNGgQMTExtGjRggkTJtC1a9eL9ikjI4MJEyYwYsQIDhw4QGBgIK1ataJz584O+w4iIuJ4Te98gt9Lilm3eDTG4gJCIppxX/+3qfa39fT5x3IoPpVrvf9hwwIAlk7tZVPXXY9MpOGtD1ZOx0VE5OpgUMSzvAyWvy+SlEr1xkp9ehERERG5fg3tdHVt1lM8/8InYFQU956jKqWdyuTwiKeIiIiIiMg1wenqGihfSRQrPkvHjh3x9PQs87rYGZ8iIiIiIiJyLkU8zzJz5kyKi4vLfObv71/JvRERERERkSuFQWs8y00Dz7Nc6EgUERERERERuXQaeIqIiIiIiNhDazzLTbFiERERERERcShFPEVEREREROyhNZ7lpi8nIiIiIiJylZsyZQrh4eFUr16dli1b8r///e+8ed9++23atGmDn58ffn5+tGvX7oL5K4IGniIiIiIiIvYwGCrnukTvv/8+w4cPZ8yYMXz77bc0btyYe+65hyNHjpSZPysri+7du7Nu3To2btxInTp1uPvuuzlw4MDlfqHzMlgsFovDapcLemOlPr2IiIiIXL+Gdrq6Nus5vTitUtqp3nXEJeVv2bIlLVq04M033wTAbDZTp04dhg4dyrPPPnvR8iaTCT8/P95880169epVrj5fjCKeIiIiIiIi9nByqpzrEpSUlLB582batWv3t2460a5dOzZu3GhXHUVFRZSWluLv739JbV8KbS4kIiIiIiJyBTEajRiNRps0Nzc33Nzczsl77NgxTCYTtWrVskmvVasWP/30k13tPfPMM4SGhtoMXiuaIp4iIiIiIiL2MDhVypWamoqPj4/NlZqa6pBXeumll1i4cCFLly6levXqDmkDFPEUERERERG5oowcOZLhw4fbpJUV7QQIDAzE2dmZw4cP26QfPnyY4ODgC7bzyiuv8NJLL7FmzRpiYmIur9MXoYiniIiIiIiIPZwMlXK5ubnh7e1tc51v4Onq6kqzZs1Yu3atNc1sNrN27Vri4uLO+yovv/wy48ePJzMzk+bNm1f4pzqbIp4iIiIiIiJXseHDh9O7d2+aN2/Orbfeyuuvv86pU6fo06cPAL169SIsLMw6XXfSpEmMHj2a9957j/DwcA4dOgSAp6cnnp6eDumjBp5VqG39ss/VERERERG5PtS6eJYrieHKnDDarVs3jh49yujRozl06BBNmjQhMzPTuuFQTk4OTn/bLfett96ipKSEhx9+2KaeMWPGkJKS4pA+6hzPKrR19+GLZxIRERERuUbdUu/qGnieXv5mpbRT/R9DKqWdyqSIp4iIiIiIiD0MhqruwVXryowVi4iIiIiIyDVDEU8RERERERF7OCluV176ciIiIiIiIuJQiniKiIiIiIjYQ2s8y00RTxEREREREXEoRTxFRERERETscYWe43k10JcTERERERERh1LEU0RERERExB7a1bbc9OVERERERETEoRTxFBERERERsYd2tS23Co94WiwW+vfvj7+/PwaDgezs7IpuQkRERERERK4iFT7wzMzMZPbs2Xz88cccPHiQm2+++bLrTEpKokuXLpffuQqwf/9+DAbDOdd///vfqu6aiMh1z2KxsHDeOzzRswuPPtCOsaOGcfDALxctt+rjDxnUJ5HuXdrx7LAB7Nqx7bz1Txj9NA93up3/bfyyorsvIiJXOoNT5VzXoAp/qz179hASEkJ8fDzBwcFUq3blzOY1mUyYzeYKqWvNmjUcPHjQejVr1qxC6hURkfJbtuQ9/u+jD+j/zxFMfHU6btWrM/6FZEpKjOcts/6Ltcx5ewpdH03i5f/MJDyiHhNeSCY/L/ecvB8vW6xZViIiIuVQoQPPpKQkhg4dSk5ODgaDgfDwcMxmM6mpqURERODu7k7jxo1ZsmSJtYzJZKJv377W5/Xr1yc9Pd36PCUlhTlz5rB8+XJrdDErK4usrCwMBgN5eXnWvNnZ2RgMBvbv3w/A7Nmz8fX1ZcWKFTRq1Ag3NzdycnIwGo0kJycTFhaGh4cHLVu2JCsr65LeNSAggODgYOvl4uJyOZ9OREQuk8ViYeXyxTzU7TFujWtDeERdho54jtwTx/nfxq/OW+6jpYto16Ezd7a/lzo3hNN/yAjcqlfns09W2uTbt2cXHy19n8FPPuvoVxERkSuVwVA51zWoQsOR6enp1K1blxkzZrBp0yacnZ1JTU1l/vz5TJs2jaioKL744gt69uxJUFAQCQkJmM1mateuzeLFiwkICGDDhg3079+fkJAQEhMTSU5OZvv27RQUFJCRkQGAv78/GzZssKtPRUVFTJo0iZkzZxIQEEDNmjUZMmQI27ZtY+HChYSGhrJ06VI6dOjA1q1biYqKsqve+++/n9OnTxMdHc2///1v7r///nJ/NxERuXxHDh0kL/cEMU2aW9M8PDyJqt+QnT/9QOuEu84pU1payt7dO3kwsac1zcnJiVuaNGPHTz9a04ynT5M+eRxPDHoKP/8Ax76IiIjINahCB54+Pj54eXnh7OxMcHAwRqORiRMnsmbNGuLi4gCIjIzkq6++Yvr06SQkJODi4sLYsWOtdURERLBx40YWLVpEYmIinp6euLu7YzQaCQ4OvuQ+lZaWMnXqVBo3bgxATk4OGRkZ5OTkEBoaCkBycjKZmZlkZGQwceLEC9bn6elJWloat912G05OTnzwwQd06dKFZcuWafApIlKFcnOPA+Dr52eT7uPrT17uiTLLnCzIx2w24eNrW8bX158Dv+RY72e//Qb1G97MrXFtKrjXIiJyVdE5nuXm0AWYu3fvpqioiPbt29ukl5SUEBsba72fMmUKs2bNIicnh+LiYkpKSmjSpEmF9MHV1ZWYmBjr/datWzGZTERHR9vkMxqNBARc/LfYgYGBDB8+3HrfokULfvvtNyZPnnzBgafRaMRotF1jVGI04urmZu+riIjI33yx7hNmvJlmvR+ZMskh7Wz671ds/f5bJv/nHYfULyIicj1w6MCzsLAQgJUrVxIWFmbzzO2PAdfChQtJTk4mLS2NuLg4vLy8mDx5Ml9//fUF63b647cNFovFmlZaWnpOPnd3dwx/myddWFiIs7MzmzdvxtnZ2Savp6fnJbzdX1q2bMmnn356wTypqak2kV2AgUNHMPhfT5erTRGR612Llq2Jqt/Iev/7Hz8D8nJz8fMPtKbn550gPLJemXV4efvg5OR8zkZCeXkn8PXzB+CH77/l8MHf6J3YySbPKxNfoMFNMYx76T8V8j4iInLls1yj6y8rg0MHnn/f0CchIaHMPOvXryc+Pp7Bgwdb0/bs2WOTx9XVFZPJZJMWFBQEwMGDB/H7Y1qVPWeGxsbGYjKZOHLkCG3aVMyUqezsbEJCQi6YZ+TIkTaRUoBdv+RVSPsiItcj9xo1cK9Rw3pvsVjw9fNn63ebiah7Zr1+UdEpdu3Yzt33dimzDhcXFyLrRbM1e7N1Gq3ZbGZr9rd07PwAAF0e7sFdd3e2KTf8n0n07jeE5rfGO+DNRERErj0OHXh6eXmRnJzMsGHDMJvNtG7dmvz8fNavX4+3tze9e/cmKiqKuXPnsnr1aiIiIpg3bx6bNm0iIiLCWk94eDirV69mx44dBAQE4OPjQ7169ahTpw4pKSm8+OKL7Ny5k7S0tAv05ozo6Gh69OhBr169SEtLIzY2lqNHj7J27VpiYmLo1KnTBcvPmTMHV1dX61ThDz/8kFmzZjFz5swLlnNzc7NGef/k6lZ80f6KiIh9DAYDnf7RlQ8WziUktDY1g0NYOO8d/PwDuDWutTVfyqinaBnXho73PQTAfQ8k8uarqdSNqk+96IasXL4Y4+li7mh/LwB+/gFlbigUFFSLWsGhlfNyIiIiVzmHH7I5fvx4goKCSE1NZe/evfj6+tK0aVNGjRoFwIABA9iyZQvdunXDYDDQvXt3Bg8ezKpVq6x19OvXj6ysLJo3b05hYSHr1q2jbdu2LFiwgEGDBhETE0OLFi2YMGECXbt2vWifMjIymDBhAiNGjODAgQMEBgbSqlUrOnfufNGyf77Tzz//TLVq1WjQoAHvv/8+Dz/8cPk+kIiIVJguDz+K8fRppr/xCqdOFdKg0S08P/4VXF3/+sXf4YO/UVCQb72/7fa7KMjPY+H8WeTlnpmW+9y4V6xTbUVERKwM2lyovAyWvy+SlEq1dffhqu6CiIiIiEiVuaVeraruwiUpXvdupbTjfkePSmmnMjk84ikiIiIiInJNUMSz3PTlztKxY0c8PT3LvC52xqeIiIiIiIicSxHPs8ycOZPi4rI3/fH313ofEREREZHrlY5TKT8NPM9y9nmjIiIiIiIicnk08BQREREREbGH1niWm76ciIiIiIiIOJQiniIiIiIiIvbQGs9yU8RTREREREREHEoRTxEREREREXs4KW5XXvpyIiIiIiIi4lCKeIqIiIiIiNhB53iWnyKeIiIiIiIi4lCKeIqIiIiIiNhD53iWm76ciIiIiIiIOJQiniIiIiIiInawKOJZbhp4ViFPw8mq7oKIiIiISBWqVdUdkEqigaeIiIiIiIg9tKttuSlWLCIiIiIiIg6liKeIiIiIiIgdtMaz/PTlRERERERExKEU8RQREREREbGH1niWmyKeIiIiIiIi4lCKeIqIiIiIiNhDazzLTV9OREREREREHEoRTxERERERETtYtMaz3BTxFBEREREREYdSxFNERERERMQeWuNZbvpyIiIiIiIi4lAVPvC0WCz0798ff39/DAYD2dnZFd2EiIiIiIhIpbNgqJTrWlThU20zMzOZPXs2WVlZREZGEhgYeNl1JiUlkZeXx7Jlyy6/gxXAYrGQlpbGjBkz+PnnnwkMDGTw4ME899xzVd01EZFr1oqPPmbJBx+Qm5tLZEQEgwcNpH79+ufN/8WXXzJ33nwOHz5MWGgojz/eh1tbtLA+t1gszJs/n1WZqzl16hSNGjVk6D//SVhY2Dl1lZSW8tSwYezdu48pb/yHunXrAvDLr7/yxptvkpPzC6dOnSIgwJ+2CW3p2eNRqlXTahYREZE/VfhPxT179hASEkJ8fHxFV33ZTCYTBoMBJ6fLC/Q++eSTfPLJJ7zyyivccsstnDhxghMnTlRQL0VE5Gyff/4Fb7/9NkOHDKF+g/osW7aM5154gZkzZuDr63tO/m3btvHSpJfpk5REy1tbsC7rc8aNn8Cb/0knPDwcgMVLlrB8xUckDx9GreBg5s6bx3MvvMCMadNwdXW1qe+dd2YR4B/A3r37bNKrOTvT7s67qFevLh4enuzdt5f0/7yBxWKhT1JvR30OERGpIhat8Sy3Cv1ySUlJDB06lJycHAwGA+Hh4ZjNZlJTU4mIiMDd3Z3GjRuzZMkSaxmTyUTfvn2tz+vXr096err1eUpKCnPmzGH58uUYDAYMBgNZWVlkZWVhMBjIy8uz5s3OzsZgMLB//34AZs+eja+vLytWrKBRo0a4ubmRk5OD0WgkOTmZsLAwPDw8aNmyJVlZWXa94/bt23nrrbdYvnw5999/PxERETRr1oz27dtXxCcUEZEyfLh0KR06dODuu9tz4w03MHTIENzcqrP6k0/KzL9s+QqaN2tG14cf4oYbbqB3r8eoV7cuKz76GDgT7Vy6bDndH+lGXFwckRERPD1iBMePn2DDxo02dW3a9A3fbvmWJ57oe047ISEh3H13eyIjI6lVqyZxrVpxR9u2/PDjjxX/EURERK5iFTrwTE9PZ9y4cdSuXZuDBw+yadMmUlNTmTt3LtOmTePHH39k2LBh9OzZk88//xwAs9lM7dq1Wbx4Mdu2bWP06NGMGjWKRYsWAZCcnExiYiIdOnTg4MGDHDx48JKiqUVFRUyaNImZM2fy448/UrNmTYYMGcLGjRtZuHAh33//PV27dqVDhw7s2rXrovV99NFHREZG8vHHHxMREUF4eDhPPPGEIp4iIg5SWlrKrt27iW3SxJrm5OREbJMmbP/ppzLLbP/pJ2Jjm9ikNWvW1Jr/0KFD5Obm2tTp4eFBg/r12b79rzpzc3NJ/89/eHpEMm5ubhft62+//cbmzZu55eab7X9BERG5ehicKue6BlXoVFsfHx+8vLxwdnYmODgYo9HIxIkTWbNmDXFxcQBERkby1VdfMX36dBISEnBxcWHs2LHWOiIiIti4cSOLFi0iMTERT09P3N3dMRqNBAcHX3KfSktLmTp1Ko0bNwYgJyeHjIwMcnJyCA0NBc4MbjMzM8nIyGDixIkXrG/v3r38/PPPLF68mLlz52IymRg2bBgPP/wwn3322SX3T0RELqygoACz2Yyvn69Nuq+vL7/88kuZZXJzc8+Zguvr60tubq71OYCvn99581gsFtJefY17772X6OgoDh0+fN4+Dhsxgt2791BaWkrHjh3o9VjPS3lFERGRa55Ddz7YvXs3RUVF50xDLSkpITY21no/ZcoUZs2aRU5ODsXFxZSUlNDkb7+Fvhyurq7ExMRY77du3YrJZCI6Otomn9FoJCAg4KL1mc1mjEYjc+fOtdbxzjvv0KxZM3bs2HHejS6MRiNGo/GcNHt+gy4iIpVv+YqPKCouplti14vmHfXssxQVF7N3717eeWcWHwR/SNeuD1dCL0VEpDJZDNfmjrOVwaEDz8LCQgBWrlx5zi6Bfw64Fi5cSHJyMmlpacTFxeHl5cXkyZP5+uuvL1j3nxsEWSwWa1ppaek5+dzd3TH87S9IYWEhzs7ObN68GWdnZ5u8np6eF32nkJAQqlWrZjNwbdiwIXAmmnq+gWdqaqpNZBfgX0OH8tST/7pomyIi1zNvb2+cnJzIy82zSc/Ly8PP36/MMn5+fjZ7AFjz/xHh/POfebm5BPj72+SJjIwE4LvvvuOnn37ivn90saln6JNPcecdd5A8Yrg1LSgoCIAbb7gBs9nMf954kwcffOCcnzMiIiLXK4cOPP++oU9CQkKZedavX098fDyDBw+2pu3Zs8cmj6urKyaTySbtzx/yBw8etP4PhD1nhsbGxmIymThy5Aht2rS5lNcB4LbbbuP3339nz5491u30d+7cCcCNN9543nIjR45k+PDhNmm//Vr2FDEREfmLi4sLUfXqkf1dNvHxZ5ZtmM1msrOzue++zmWWadigAdnZ3/FAly7WtG+3bKFhgwYABAcH4+fnR/Z331n/W36qqIifduygU6d7ARg0cAC9ez1mLX/8xAmee/4FRj37LPUbnP8YF4vFwu+//27zi1EREbk2aFfb8nPowNPLy4vk5GSGDRuG2WymdevW5Ofns379ery9venduzdRUVHMnTuX1atXExERwbx589i0aRMRERHWesLDw1m9ejU7duwgICAAHx8f6tWrR506dUhJSeHFF19k586dpKWlXbRP0dHR9OjRg169epGWlkZsbCxHjx5l7dq1xMTE0KlTpwuWb9euHU2bNuXxxx/n9ddfx2w2889//pP27dufM33379zc3M6ZVntc02xFROzy4AMP8MqrrxIVFUX96GiWLl/OaeNp7v5jKcfkV9IICAjg8T5JAHT5x/08/cyzfPDhh9zaogVZn3/Brl27eXLoUAAMBgMPdPkHCxYuJDQ0lOBaZ45TCQjwJ/6PPQlq1qxp04fq7u4AhIQEE/THGdWfrVtHNedqhIffiIuLC7t27SZj9hxuv72NzvEUERH5G4f/VBw/fjxBQUGkpqayd+9efH19adq0KaNGjQJgwIABbNmyhW7dumEwGOjevTuDBw9m1apV1jr69etHVlYWzZs3p7CwkHXr1tG2bVsWLFjAoEGDiImJoUWLFkyYMIGuXS++FicjI4MJEyYwYsQIDhw4QGBgIK1ataJz57J/c/53Tk5OfPTRRwwdOpTbb78dDw8POnbsaNegV0REyich4XbyC/KZN28+ubm5REZGMmHcOOuMlyNHj2Jw+mtZRaNGjXjm308zZ+48Zs+eQ2hYGKNfeN56hidA14cf5vTp0/znjTcoLDzFTTc1YsK48eec4Xkhzk7OLFqymAMHfsNisVCzZk3u69yZBx/oUlGvLiIiVxKt8Sw3g0VzgarMvj27q7oLIiIiIiJVJqJuvaruwiU5sfWrSmnH/5bWldJOZdIkZREREREREXEoDTzP0rFjRzw9Pcu8LnbGp4iIiIiIXLssBqdKua5F2vngLDNnzqS4uLjMZ/5/23JfRERERERE7KOB51nOPm9UREREREQEwII2FyqvazOOKyIiIiIiIlcMRTxFRERERETscK2uv6wM+nIiIiIiIiLiUIp4ioiIiIiI2MOgNZ7lpYiniIiIiIiIOJQiniIiIiIiInawKG5XbvpyIiIiIiIi4lCKeIqIiIiIiNjBojWe5aaIp4iIiIiIiDiUIp4iIiIiIiJ20Dme5acvJyIiIiIiIg6liGcVCjq6raq7ICIiIiJSderWq+oeXBILWuNZXop4ioiIiIiIiEMp4ikiIiIiImIHrfEsP305ERERERERcShFPEVEREREROygczzLTxFPERERERERcShFPEVEREREROygXW3LTxFPERERERERcShFPEVERERE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9erV7Nixg4CAAHx8fKhXrx516tQhJSWFF198kZ07d1rXWl5IdHQ0PXr0oFevXqSlpREbG8vRo0dZu3YtMTExdOp04TU7x44dY8mSJbRt25bTp0+TkZHB4sWL+fzzzy9Yzs3NzRrl/ZOrW8FF+ysiIvYxGAzc1+VBFi18l5DQ2tSqFcx78zLwDwikVVxra74XRibTKr41nf4YWP7jgYdJf3US9aKiiYpuwEfLP+C08TTt2t8DnBl0jnnuGYzG0wx7ehRFRUUUFRUB4O3jow2GRERE7ODweULjx48nKCiI1NRU9u7di6+vL02bNmXUqFEADBgwgC1bttCtWzcMBgPdu3dn8ODBrFq1ylpHv379yMrKonnz5hQWFrJu3Tratm3LggULGDRoEDExMbRo0YIJEybQtWvXi/YpIyODCRMmMGLECA4cOEBgYCCtWrWic+fOdr3TnDlzSE5OxmKxEBcXR1ZWFrfeemv5PpCIiFSYBx9+hNOnTzP1jVc5VVhIw5tuYcy4VJsI5aGDv1GQn2+9b5NwBwUF+bw3bza5uWem5Y4Z9xK+fmem2u7ZvYudO7YDMLDvYzbtzch4l1q1Ln3jOxERuTppV9vyM1h0+GSV+WnPr1XdBRERERGRKtOgbu2q7sIlWfK1uVLaebjl+TctvVppZwQRERERERE7KGRXftfeUPoydezYEU9PzzKvi53xKSIiIiIiIudSxPMsM2fOpLi4uMxn/mdtrS8iIiIiItcPRTzLTwPPs5x93qiIiIiIiIhcHg08RURERERE7GC26BzP8tIaTxEREREREXEoRTxFRERERETsoDWe5aeIp4iIiIiIiDiUIp4iIiIiIiJ2UMSz/BTxFBEREREREYdSxFNERERERMQOZkU8y00RTxEREREREXEoDTxFRERERETEoTTVVkRERERExA4Wi6Gqu3DVUsRTREREREREHEoRzyr08XehVd0FEREREZEq06BuVffg0lwLx6mcOHGCoUOH8tFHH+Hk5MRDDz1Eeno6np6e580/ZswYPvnkE3JycggKCqJLly6MHz8eHx8fu9tVxFNEREREROQ60aNHD3788Uc+/fRTPv74Y7744gv69+9/3vy//fYbv/32G6+88go//PADs2fPJjMzk759+15SuwaL5VoYt1+dXvnQXNVdEBERERGpMskPXl1xsNlZldNOUlvH1Lt9+3YaNWrEpk2baN68OQCZmZnce++9/Prrr4SG2jcjc/HixfTs2ZNTp05RrZp9k2ivrj9pERERERGRa5zRaKSgoMDmMhqNl13vxo0b8fX1tQ46Adq1a4eTkxNff/213fXk5+fj7e1t96ATNPAUERERERGxi8VSOVdqaio+Pj42V2pq6mX3/9ChQ9SsWdMmrVq1avj7+3Po0CG76jh27Bjjx4+/4PTcsmjgKSIiIiIicgUZOXIk+fn5NtfIkSPPm//ZZ5/FYDBc8Prpp58uu18FBQV06tSJRo0akZKScklltautiIiIiIiIHSprdxw3Nzfc3Nzszj9ixAiSkpIumCcyMpLg4GCOHDlik/77779z4sQJgoODL1j+5MmTdOjQAS8vL5YuXYqLi4vd/QMNPEVERERERK5qQUFBBAUFXTRfXFwceXl5bN68mWbNmgHw2WefYTabadmy5XnLFRQUcM899+Dm5saKFSuoXr36JfdRU21FRERERETsYLZUzuUoDRs2pEOHDvTr14///e9/rF+/niFDhvDII49Yd7Q9cOAADRo04H//+x9wZtB59913c+rUKd555x0KCgo4dOgQhw4dwmQy2d22Ip4iIiIiIiLXiXfffZchQ4Zw11134eTkxEMPPcR//vMf6/PS0lJ27NhBUVERAN9++611x9t69erZ1LVv3z7Cw8PtalcDTxERERERETtU1hpPR/L39+e999477/Pw8HAsf3vRtm3b2tyXl6baioiIiIiIiEMp4ikiIiIiImIHs7mqe3D1uqSIp8VioX///vj7+2MwGMjOznZQt0RERERERORacUkRz8zMTGbPnk1WVhaRkZEEBgZedgeSkpLIy8tj2bJll13X5Tp9+jQDBw5k8+bNbN++nc6dO5fZr6ysLIYPH86PP/5InTp1eP755y96bo6IiDiexWJh85o3+GnTYkqKT1LrxlhadxmDT2D4ectkZ81g3w+fkn90L84u1al1Yyy3dhiBb1CETb7DP29h0yfpHP3lewxOTgSENKDj4zOp5nLpW8qLiMjV6VpY41lVLiniuWfPHkJCQoiPjyc4OJhq1a6cmbomkwnzZca+TSYT7u7u/Otf/6Jdu3Zl5tm3bx+dOnXijjvuIDs7m6eeeoonnniC1atXX1bbIiJy+b77YiY/bphP6y4p/GPw+7i41mDVrH78Xmo8b5mDezdx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Vq1a0blzZ7ve6d577+Xnn3+23v+5XvXPsHpERAQrV65k2LBhpKenU7t2bWbOnMk999xj93cTERHHaHz7E/xeUsyXS8dQcrqAWjc2pUOfGTbr6QuO53C6KNd6v/3rhQB8/HZvm7oSHp5IdLMHALildW9Mv5fw35UvYSzKxz+kPvf2fQfvgBsq4a1ERESufgZL5U1UlrO88qEiniIiIiJy/Up+0Kmqu3BJ0j+qnKHTk/dde2s8r64/aREREREREbnqXFcDz44dO+Lp6VnmVRFnfIqIiIiIyLXLYqmc61p0WWs8rzYzZ86kuLi4zGf+/v6V3BsREREREZHrw3U18Dz7vFERERERERF7ma/RaGRluK6m2oqIiIiIiEjlu64iniIiIiIiIuV1ra6/rAyKeIqIiIiIiIhDKeIpIiIiIiJiB0ulLfLUOZ4iIiIiIiIil0QRTxERERERETtoV9vyU8RTREREREREHEoRTxERERERETtoV9vyU8RTREREREREHEoRTxERERERETuYtciz3BTxFBEREREREYdSxLMK/aPxL1XdBRERERGRKnRjVXdAKokGniIiIiIiInbQ5kLlp6m2IiIiIiIi4lCKeIqIiIiIiNhBEc/yU8RTREREROT/27v7uKrr+//jzwMCEiBX4rjwAhDwoomCOMXpcEuXmi03F2U6pbxKU0plps0ZpMJcMaPm5VzgReqy8qKcWDnJyznzK+UCNTEjHaa/AJXQA3LO7w/nyTNRj0cOePG4327nduu8P+/P+/36fG7dOr14fd7vDwCHouIJAAAAADYwUfK0GxVPAAAAAIBDUfEEAAAAABuYTQ0dwZ2LiicAAAAAwKGoeAIAAACADcys8bQbFU8AAAAAgENR8QQAAAAAG5hY42k3Kp4AAAAAAIei4gkAAAAANmCNp/1uquJpNps1evRo+fn5yWAwKD8/30FhAQAAAADuFjdV8czNzVVOTo7y8vIUHh6upk2b3nIASUlJKi8v17p16255rFt14cIFPf3009q3b58KCws1YMCAq+IqKSnR5MmT9cknn+jIkSNKTk7Wq6++2iDxAsC9xGw2680Vy7Q5d5O++65C7drfr3HPJCskJOS6573/3ga9+84alZWVKiwsXGPGPqM2bdpajldVVemvf1mkbdvyVF1drdjYOI19ZoJ8fX0tffLz92vF8qX66tiXcmvc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\n"
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Feature Influence matrix:\n",
            "            Influence\n",
            "feature_1   -0.056371\n",
            "feature_2   -0.114215\n",
            "feature_3   -0.026363\n",
            "feature_4   -0.238248\n",
            "feature_5   -0.040000\n",
            "feature_6    0.004299\n",
            "feature_7    0.114215\n",
            "feature_8   -0.024027\n",
            "feature_9   -0.019776\n",
            "feature_10  -0.255876\n",
            "feature_11  -0.009602\n",
            "feature_12   0.113848\n",
            "feature_13   0.018750\n"
          ]
        }
      ]
    }
  ],
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}